Иногда при работе с типами возникает необходимость принудительно сменить тип переменной, например, если библиотека предоставляет неправильные типы.
Переопределение типов — это процесс, при котором мы заставляем компилятор считать переменную типом, отличным от первоначально заявленного.
Переопределение типа с помощью ключевого слова as
Простой способ переопределить тип переменной — использовать ключевое слово as, которое непосредственно меняет тип данной переменной.
Пример
let x: unknown = 'hello';
console.log((x as string).length); // выводит 5
Однако следует помнить, что тип данных в переменной не меняется физически. Например, следующий код не сработает, как ожидалось, потому что переменная x всё ещё содержит число:
Пример
let x: unknown = 4;
console.log((x as string).length); // выведет undefined, так как числа не имеют свойства length
TypeScript постарается проверить правильность переопределения типа, чтобы предотвратить бессмысленные преобразования. Например, следующая строка вызовет ошибку, потому что TypeScript знает, что невозможно просто так преобразовать число в строку без явного преобразования данных:
Пример
console.log((4 as string).length);
// Ошибка: Преобразование типа 'number' в тип 'string' может оказаться ошибкой,
// так как ни один из типов не перекрывает другой.
// Если это сделано намеренно, сначала преобразуйте выражение в тип 'unknown'.
Ниже в разделе "Принудительное переопределение типа" рассказано, как обойти это ограничение.
Переопределение типа с помощью угловых скобок <>
Использование угловатых скобок <> работает аналогично ключевому слову as.
Пример
let x: unknown = 'hello';
console.log((<string>x).length); // выводит 5
Однако этот способ несовместим с TSX (например, при работе с файлами React).
Принудительное переопределение типа
Чтобы заставить TypeScript проигнорировать ошибки при переопределении типа, первым делом следует преобразовать переменную в тип unknown, а затем в целевой тип.
Пример
let x = 'hello';
console.log(((x as unknown) as number).length); // выведет undefined, так как x на самом деле не число
Вывод:
- Ключевое слово
asи угловые скобки<>позволяют переопределять типы переменных. - Будьте внимательны при переопределении типов, так как физический тип данных в переменной не изменится.
- Используйте тип
unknownдля принудительной смены типа, если TypeScript выдает ошибку.