> Что такое типы any и unknown в TypeScript (TypeScript)

Уровень: junior · Роль: frontend · Категория: Технические вопросы

Компании: Иннотех, Инрэко, Kvando Technologies, Soft_Media_Group, ООО Премиум ИТ Солюшен, IT-One, Swetec, ПСБ, EdenAI, Арго, HolyWeb, SmartWay, Altenar

Стек: TypeScript

> Пример ответа

Короткий ответ

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

Подробное объяснение

any - это escape hatch из системы типов. При присвоении значения типа any переменной, TypeScript не проверяет, какие методы или свойства к ней применяются. Это удобно для быстрого прототипирования или миграции с JavaScript, но лишает преимуществ статической типизации - ошибки могут проявиться только в runtime.

unknown - это строгий any. Переменная типа unknown может хранить любое значение, но для работы с ней требуется сузить тип через проверки (type guards), приведение (type assertion) или анализ структуры. Компилятор не позволит вызывать методы, обращаться к свойствам или выполнять арифметические операции без явного подтверждения типа.

Ключевое различие: any разрешает всё, unknown требует доказательств. unknown предпочтительнее при работе с данными из внешних источников (API, пользовательский ввод, JSON.parse), когда тип неизвестен заранее, но нужна безопасность.

На практике

  • Используйте any только в крайних случаях: при миграции JS-кода, для быстрых прототипов, или когда тип действительно невозможно описать (редкие edge cases).
  • Отдавайте предпочтение unknown для значений, тип которых не определён на этапе компиляции. Это заставляет явно обрабатывать разные сценарии и предотвращает случайные ошибки.
  • Для сужения unknown применяйте typeof, instanceof, пользовательские type guards или as (type assertion) после проверки.
  • Вместо any в generic-функциях используйте unknown или обобщённые типы с ограничениями.

Пример кода

TYPESCRIPT
// any - нет проверок
let dataAny: any = 'hello';
dataAny.toUpperCase(); // OK
dataAny = 42;
dataAny.toFixed(); // OK, хотя строка не имеет toFixed
// unknown - требует проверки
let dataUnknown: unknown = 'hello';
// dataUnknown.toUpperCase(); // Ошибка: Object is of type 'unknown'
// Правильно: сужаем тип
if (typeof dataUnknown === 'string') {
dataUnknown.toUpperCase(); // OK
}
// Пример с JSON.parse
const jsonData: unknown = JSON.parse('{"name": "Alice"}');
// jsonData.name; // Ошибка
if (typeof jsonData === 'object' && jsonData !== null) {
const obj = jsonData as { name: string };
console.log(obj.name); // OK после приведения
}

Как отвечать на собеседовании

Начните с краткого определения обоих типов. Подчеркните, что any отключает проверку типов, а unknown - безопасная альтернатива. Объясните разницу на примере: с any можно вызвать любой метод без ошибки компиляции, с unknown нужно сначала проверить тип. Упомяните, что unknown предпочтительнее для данных извне. Приведите простой пример с typeof или as. Не углубляйтесь в сложные сценарии - для junior достаточно базового понимания.

Что проверяет интервьюер

  • Понимание системы типов TypeScript и разницы между any и unknown.
  • Знание, когда какой тип применять (безопасность vs удобство).
  • Умение сужать unknown с помощью type guards.
  • Осознание рисков использования any в production-коде.

Типичные ошибки

  • Утверждение, что any и unknown - одно и то же.
  • Использование any по умолчанию для всех неизвестных значений.
  • Попытка работать с unknown без проверки типа (вызов методов напрямую).
  • Забывание, что null и undefined тоже могут быть unknown, и проверка на null обязательна при работе с объектами.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью