Введение

В предыдущей статье я писал об объявлении машинописного окружения, которое является одним из основных принципов этого прекрасного языка, в сегодняшней статье я расскажу о машинописном наборе как профессионал.

Большинство письменных руководств не показывают вам подробно все разнообразие машинописного набора, предлагаемого вам.

Вот так:

Сопоставленные типы

Чтобы уменьшить объем усилий, необходимых для создания похожих типов, отличающихся только опциональностью или удобочитаемостью,
сопоставленные типы позволяют создавать варианты существующего типа в одном выражении. Сопоставляемые типы используют ключевое слово
keyof, которое представляет собой запрос типа индекса, который собирает список разрешенных имен свойств для типа в
вашей программе.

Параметры интерфейса {
материал: строка;
подсветка: логическое значение;
}

// Созданный вручную интерфейс только для чтения
interface ManualReadonlyOptions {
только для чтения material: string;
только для чтения backlight: boolean;
}

// Созданный вручную необязательный интерфейс
interface ManualOptionalOptions {
material?: string;
backlight?: string;
}

// Созданный вручную интерфейс, допускающий значение null
interface ManualNullableOptions {
material: string | null;
подсветка: строка | ноль;
}

Параметры интерфейса {
material: string;
backlight: boolean;
}
// сопоставленные типы
type ReadOnly‹T› = { readonly [k in keyof T] : Т[к]; }
type Необязательный‹T› = {[k в ключе T]?: T[k]; }
type Nullable‹T› = {[k в ключе T]: T[k] | нулевой; }

Типы словарей

Вы можете представлять словари в TypeScript, используя тип индекса,
указывает ключ и его тип в квадратных скобках, а затем тип значения в виде аннотации типа.
Словарь головоногих представляет собой объект с динамическими ключами. , но TypeScript обеспечит правильность типов ключей и значений.

interface Cephalopod {
hasInk: логическое значение;
руки: число;
щупальца: число;
}
interface CephalopodDictionary {
[index: строка ]: Головоногие;

let Dictionary: CephalopodDictionary = {};
Dictionary['octopus vulgaris'] = { hasInk: true, Arms: 8, Tentales: 0 };
Dictionary['loligo vulgaris'] = { hasInk: true , руки: 8, щупальца: 2 };
// Ошибка. Невозможно присвоить типу «головоногие»
Dictionary[0] = { hasInk: true };
const octopus = Dictionary[‘octopus vulgaris’];

Утверждения типа

В тех случаях, когда TypeScript определяет, что присвоение является недопустимым, но вы знаете, что имеете дело
с особым случаем, вы можете переопределить тип, используя утверждение типа. Когда вы используете утверждение типа, вы
берете на себя ответственность от компилятора и должны убедиться, что присвоение допустимо. Ваша программа может
работать неправильно, если вы сделаете ошибку.
Переменная свойства может быть домом или особняком, поэтому последующее присвоение переменная, объявленная
как Mansion, потерпит неудачу. Поскольку мы знаем, что переменная совместима с интерфейсом Mansion (у нее есть все
три свойства, необходимые для соответствия интерфейсу), утверждение типа ‹Mansion› подтверждает это компилятору.

интерфейс Дом {
спальни: количество;
ванные комнаты: количество;
}

интерфейс Особняк {
спальни: количество;
ванные комнаты: количество;
дворецкие: количество;
}

функция getProperty() : Дом | Особняк {
// …
}
const property = getProperty();
// ОК, так как свойство есть и в Доме, и в Особняке
const roomCount = property. спальни;
// Ошибки: Свойство 'батлеры' не существует для типа 'Дом | Mansion’
const butlerCount = property.butlers;
// ОК с утверждением типа
const workingButlerCount = (‹Mansion›property).butlers;