Вопрос с собеседования · Frontend

Зачем нужен TypeScript и чем any отличается от unknown?

JuniorTypeScript
Ещё спрашивают так:
  • Проверяет ли 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 минут бесплатно.

Разбор собеседования