Sobes.tech
Назад к вопросам
Middle
4

В чём разница между any и unknown в TypeScript? Почему на any не ругается линтер, а на unknown требует сужения типа?

Компании, где спрашивали
Altenar

Ответ от нейросети

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)); // теперь безопасно
}