Зачем нужен TypeScript и чем any отличается от unknown?
- Проверяет ли TypeScript типы во время выполнения?
TypeScript добавляет к JavaScript статические типы, которые проверяются при компиляции и стираются в итоговом JS. Польза: ошибки до запуска, автодополнение, безопасный рефакторинг, типы как документация. any отключает проверку; unknown — «что угодно», но перед использованием тип нужно сузить проверкой.
- Данные из сети типы не гарантируют — проверять схемой (zod, valibot)
- strict: true — обязательно в новых проектах
- never — значение, которого не бывает: исчерпывающая проверка switch
А ещё Вывод типов: явные аннотации нужны в основном на границах функций
Подробно
Структурная типизация. Совместимость определяется формой объекта, а не именем типа: объект с нужными полями подходит, даже если объявлен иначе.
any vs unknown: any позволяет всё — и молча распространяется дальше, превращая проверки в формальность. unknown безопасен: к значению нельзя обратиться, пока проверка (typeof, instanceof, in, пользовательский type guard) не сузит тип.
Сужение и размеченные объединения — главный приём: объединение вариантов с полем-дискриминатором (kind), и в каждой ветке switch TypeScript знает точный тип.
Границы системы. Ответ API типизируют, но фактически сервер может вернуть что угодно — валидация схемой во время выполнения.
Пример
function parse(input: unknown): number {
if (typeof input === "number") return input; // сужение
if (typeof input === "string") return Number(input);
throw new Error("bad input");
}
type Shape = { kind: "circle"; r: number } | { kind: "square"; a: number };
function area(s: Shape): number {
switch (s.kind) {
case "circle": return Math.PI * s.r ** 2;
case "square": return s.a ** 2;
default: const _exhaustive: never = s; return _exhaustive;
}
}Что хотят услышать
- Статическая проверка и стирание типов.
- any против unknown, сужение.
- Проверка внешних данных.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Типы TypeScript проверяются во время выполнения в браузере, как PropTypes в React
- ✓Типы стираются при компиляции; any отключает проверку, unknown требует сужения
- ✗unknown можно использовать как угодно без проверок, а вот any требует сужения типа
- ✗any безопаснее unknown: он не даёт ошибок компиляции, а значит, и ошибок в коде
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.