Was ist der Unterschied zwischen any und unknown in TypeScript? Warum meckert der Linter nicht bei any, aber bei unknown ist eine Einschränkung des Typs erforderlich?
sobes.tech KI
Antwort von 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)); // теперь безопасно
}