🎯 Зачем спрашивают
- Проверить, понимает ли кандидат, как работает система типов TypeScript.
- Отличает ли он «дыры» в типах (
any) от «безопасных абстракций» (unknown).
- Умеет ли объяснить, зачем вообще нужен
unknown, если уже естьany.
- Понять, как кандидат рассуждает о type safety и компромиссе «скорость разработки vs надёжность кода».
- Может ли связать это с практикой (миграция legacy, работа с JSON API, интеграция внешних SDK).
📝 Ответ
Коротко:
any — тип-затычка, отключающий проверку типов. Компилятор перестаёт проверять совместимость и считает любое использование допустимым.Пример
let value: any; value = 42; value = "hello"; value = { x: 1 }; value.toFixed(); // ✅ компилятор не ругается, хотя value может быть строкой value.foo.bar; // ✅ тоже ок, хотя foo может не существовать
unknown — это безопасная альтернатива any, где значение может быть чем угодно, но нельзя использовать без проверки. Компилятор заставляет проверить тип перед использованием. Семантически верный тип, если тип данных неизвестен, либо не важен.let value: unknown; value = 42; value = "hello"; value = { x: 1 }; value.toFixed(); // ❌ Ошибка: Object is of type 'unknown' value.foo; // ❌ Ошибка // Нужно сузить тип: if (typeof value === "number") { value.toFixed(); // ✅ теперь ок }
⚖️ Компромиссы
- Используй
any, когда осознанно отключаешь TS (например, при миграции legacy-кода или чтобы заткнуть бесящую в моменте ошибку).
- Используй
unknown, когда данные приходят из непредсказуемого источника (например, JSON от API), и нужно потом уточнять тип. Или когда точный тип данных неважен.
🔎 Встречные вопросы
- Чем
unknownотличается отnever?
🚩 Красные флаги
anyиunknown— это одно и то же.
unknownиспользуется, когда не хочется писать тип.
- Я всегда использую
any, потому что так проще.