Jaka jest różnica między any a unknown w TypeScript? Dlaczego linter nie narzeka na any, ale wymaga zawężenia typu dla unknown?
sobes.tech AI
Odpowiedź od 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)); // теперь безопасно
}