В чём разница между any и unknown в TypeScript? Почему на any не ругается линтер, а на unknown требует сужения типа?
Ответ от нейросети
sobes.tech AI
В TypeScript any и unknown — это типы, которые могут содержать значение любого типа, но они отличаются по безопасности и поведению:
-
any— отключает проверку типов. Можно делать с переменной типаanyчто угодно без ошибок компиляции. Это удобно, но опасно, так как теряется вся типизация. -
unknown— более безопасный аналогany. Значение типаunknownможно присвоить любой переменной, но чтобы использовать его как конкретный тип, нужно сначала выполнить проверку (сужение типа). Это заставляет явно обрабатывать возможные типы и предотвращает ошибки.
Почему линтер не ругается на any, но требует сужения для unknown:
-
anyсчитается "приглушением" ошибок, и линтер обычно не запрещает его, но рекомендует избегать. -
unknownпо дизайну требует проверки, чтобы гарантировать безопасность, поэтому линтер требует сужения типа перед использованием.
Пример:
let a: any = 10;
let u: unknown = 10;
// с any можно делать что угодно:
console.log(a.toFixed(2)); // нет ошибки
// с unknown нужно сужение:
if (typeof u === 'number') {
console.log(u.toFixed(2)); // теперь безопасно
}