Type Assertion (утверждение типа) — способ для разработчика сообщить компилятору TypeScript, как следует воспринимать тип значения. Синтаксис:
let someValue: any = "пример"; let strLen: number = (someValue as string).length;
Type Assertion не преобразует данные в рантайме, а только подсказывает компилятору их тип. Если assertion ошибочен — программа не остановится, что может привести к runtime errors. В отличие от "кастинга" в C# или Java, никаких преобразований TypeScript не делает.
При использовании нельзя делать assertion между несвязанными типами напрямую (например, as number as User), но есть обходные пути через as unknown.
Безопасно ли использовать двойное утверждение
value as unknown as Typeдля приведения значения к другому типу?
Неверный ответ: Да, это безопасно, потому что так пишет большинство разработчиков TypeScript.
Правильный ответ: Нет, это опасно. Такой приём исключает проверки компилятора и позволяет превратить любой тип в любой другой, обходя типизацию, что может привести к ошибкам в рантайме. Используйте только, если уверены, что значение реально совместимо с целевым типом.
История
Разработчик делал Type Assertion для объекта из стороннего API как к собственному интерфейсу (
as MyType), не проверяя поля. API поменял структуру, и приложение стало падать на доступе к несуществующим ключам.
История
В библиотеке для работы с DOM кто-то сделал двойное assertion
el as unknown as HTMLElement, не убеждаясь в типе, и позже получал ошибку при попытке вызвать методы HTMLElement на другом объекте.
История
В попытке решить ошибку типов при интеграции с JS-кодом, один из разработчиков применил
as anyк конфигурации. Это маскировало проблему, и баг с некорректной обработкой данных всплывал только в production.