Что такое типы any и unknown в TypeScript
Что проверяют
Понимаете ли вы, зачем нужен безопасный аналог any. Это вопрос про дисциплину типов, а не про синтаксис.
Как отвечать
any отключает проверку типов: с таким значением разрешено всё, и ошибки уезжают в рантайм.
unknown это тоже «что угодно», но с обратным правилом: пока тип не сужен, с ним нельзя ничего. Ни обратиться к свойству, ни вызвать, ни присвоить в переменную конкретного типа.
function handle(value: unknown) {
// value.length: ошибка компиляции
if (typeof value === "string") {
return value.length; // здесь уже string
}
}Сужают проверкой typeof, instanceof, проверкой полей или пользовательским предикатом (value is User).
Где unknown уместен: возвращаемое значение JSON.parse, тело сетевого ответа, аргумент catch, данные из внешнего мира вообще. Это заставляет проверить форму данных до использования, а не понадеяться на неё.
any остаётся для быстрых заглушек и постепенной миграции старого кода, но каждый такой случай это дыра в типизации.
Где спотыкаются
Не знают, что unknown можно присвоить любое значение, а вот сам unknown присвоить нельзя никуда, кроме unknown и any. Это и есть его смысл.
Путают с never: это тип без значений, он означает недостижимость, а не «неизвестно что».
Обходят проверку приведением as вместо настоящего сужения. Компилятор замолкает, а ошибка остаётся.