TypeScript: Утверждение Типа

Источник: «Type Assertion in TypeScript»
В этой статье мы разберёмся как TypeScript вывод и проверяет тип переменной, используя внутренний логический механизм, называемый Type Assertion - Утверждение Типа.

Утверждение типа позволяет установить тип значения и сообщить компилятору, чтобы он не выводил его. Это когда вы, как программист, можете лучше понимать тип переменной, чем то, что может вывести TypeScript. Такая ситуация может возникнуть, когда вы переносите код из JavaScript и знаете более точный тип переменной, чем назначенный в данный момент. Это похоже на приведение типов в других языках, таких как C# и Java. Однако в отличие от C# и Java, в TypeScript нет эффекта утверждения типа во время выполнения. Это простой способ сообщить компилятору TypeScript тип переменной.

let code: any = 123;
let employeeCode = <number> code;

console.log(typeof(employeeCode)); //Вывод: number

В приведённом выше примере, у нас есть переменная code типа any. Мы присваиваем значение этой переменной другой переменной employeeCode. Однако мы знаем, что у code тип number, хотя он был объявлен как any. Таким образом присваивая code переменной employeeCode, мы утверждаем, что в данном случае code имеет тип number и мы уверены в этом. Теперь тип employeeCode — это number.

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

let employee = { };

employee.name = "John"; //Compiler Error: Property 'name' does not exist on type '{}'
employee.code = 123; //Compiler Error: Property 'code' does not exist on type '{}'

Приведённый выше пример выдаст ошибку компилятора, поскольку компилятор предполагает, что тип employee{} без свойств. Но мы можем избежать этой ситуации, используя утверждение типа, как показано ниже.

interface Employee {
name: string;
code: number;
}

let employee = <Employee> { };

employee.name = "John"; // OK
employee.code = 123; // OK

В приведённом выше примере мы создали интерфейс Employee с именем и кодом свойств. Затем мы использовали утверждение этого типа для employee. Интерфейсы используются для определения структуры переменных. Вы узнаете об этом больше в статье об интерфейсах.

Будьте осторожны при утверждении типа. Компилятор TypeScript будет автоматически заполнять свойства Employee, но не будет показывать ошибки времени компиляции, если вы забыли добавить свойства. Например:

interface Employee {
name: string;
code: number;
}

let employee = <Employee> {
// Compiler will provide autocomplete properties,
but will not give an error if you forgot to add the properties
};
console.log(employee.name); // undefined;

Вы так же можете использовать библиотеку JavaScript в TypeScript для некоторых существующих функций.

let employeeCode = <number> myJSLib.GetEmployeeCode('Steve');
console.log(typeof(employeeCode)); // number

В приведённом выше примере мы предполагаем, что myJSLib — это отдельная библиотека JavaScript, и мы вызываем её функцию GetEmployeeCode(). Итак, мы устанавливаем тип возвращаемого значения как number, потому что знаем, что она возвращает number

Есть два способа сделать утверждение типа в TypeScript:

Первый — использование синтаксиса угловой скобки <>. До сих пор в этой статье мы использовали угловые скобки, чтобы показать утверждение типа.

let code: any = 123;
let employeeCode = <number> code;

Однако есть и другой способ утверждения типа, использующий синтаксис as.

Второй — использование ключевого слова as

let code: any = 123;
let employeeCode = code as number;

Оба синтаксиса эквивалентны, и можно использовать любой из синтаксисов утверждения типа. Однако при работе с JSX в TypeScript разрешён только синтаксис as, поскольку JSX встраивается в XML как синтаксис. А поскольку XML использует угловые скобки, это создаёт конфликт при использовании утверждений типа с угловыми скобками в JSX.

Дополнительные материалы

Предыдущая Статья

Laravel: Преимущество минимальных фабрик

Следующая Статья

TypeScript: Выведение типа