ПрограммированиеFrontend-разработчик

Опишите различия между типами any, unknown и object в TypeScript. Когда стоит использовать каждый из них? Приведите примеры кода.

Проходите собеседования с ИИ помощником Hintsage

Ответ.

В TypeScript типы any, unknown и object применяются для разных сценариев и имеют ключевые различия:

  • any: отключает систему типизации для переменной. Позволяет делать с переменной что угодно, не вызывая ошибок компиляции. Используйте, когда тип объекта заранее неизвестен и безопасность не критична.
  • unknown: тоже принимает любой тип, но для работы с такими переменными требуется явная проверка/приведение типа. Безопаснее, чем any. Используйте для значений с неизвестным типом, чтобы не потерять контроль над типизацией.
  • object: тип только для нерудиментарных объектов (объекты, массивы, функции), но не для примитивов (чисел, строк). Ограничивает работу только с объектами.

Пример кода:

let a: any = 1; a = 'string'; // OK a(); // OK (но может привести к ошибке в рантайме) let b: unknown = 'hello'; b = 5; // OK // b.toUpperCase(); // Ошибка — требуется проверка типа if (typeof b === 'string') { console.log(b.toUpperCase()); } let c: object = { key: 'value' }; c = [1, 2, 3]; // OK // c = 1; // Ошибка, так как '1' не объект

Вопрос с подвохом.

Вопрос: Какую пользу приносит тип unknown, если мы можем использовать any?

Ответ: unknown повышает безопасность кода — вы не сможете выполнить с переменной непроверенные действия, как с any. Нужно явно проверить или привести тип, что исключает многие сюрпризы во время выполнения.

function handle(value: unknown) { // value.trim(); // Ошибка if (typeof value === 'string') { value.trim(); } }

Примеры реальных ошибок из-за незнания тонкостей темы.


История

На проекте решили быстро интегрировать стороннюю библиотеку, описав её результат через any, чтобы не заморачиваться с типами. В результате в рантайме обнаружили, что библиотека возвращала не массив, а объект с полями, из-за чего массово возникали ошибки метода .map() — этот код компилировался, но падал при выполнении.


История

Один из разработчиков использовал unknown для данных, пришедших с бэкенда, но не добавил проверки типа перед работой с полями. В результате, TypeScript не скомпилировал код — и пришлось по-быстрому менять на any, что скрыло потенциальные ошибки парсинга и привело к багам на проде из-за некорректного формата данных.


История

При работе с типом object возникла путаница: пытались присваивать переменной типа object значения string и number. Хотя на этапе разработки не замечали подвоха, в процессе ревью были выявлены ошибки, связанные с тем, что методы объекта не работали с примитивами. На устранение ушло дополнительное время.