> Почему нельзя использовать typeof B как тип напрямую в TypeScript? (JavaScript, TypeScript)

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

Компании: DigitalSail

Стек: JavaScript, TypeScript

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

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

typeof B в TypeScript - это type query, который возвращает тип значения переменной B, а не её значение. Использовать его напрямую как тип можно только в контексте type annotation, но не в runtime-выражениях. TypeScript компилирует typeof B в строку "number", "string" и т.д. на этапе компиляции, а не в runtime. Поэтому typeof B как тип работает только в позиции типа, а не значения.

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

В TypeScript typeof имеет два разных значения в зависимости от контекста:

  1. В позиции типа (type position) - это type query, который возвращает тип значения переменной. Например: type T = typeof someVariable.

  2. В позиции значения (value position) - это JavaScript оператор typeof, который возвращает строку с именем типа ("number", "string" и т.д.).

Проблема возникает, когда разработчик пытается использовать typeof B как тип напрямую в runtime-контексте, например:

TYPESCRIPT
const x: typeof B = 42; // Ошибка, если B не определена

TypeScript не позволяет использовать typeof B как тип, если B - это переменная, которая не существует в области видимости на момент компиляции. Это связано с тем, что TypeScript оперирует статическими типами, а typeof B в позиции типа требует, чтобы B была известна на этапе компиляции.

Кроме того, typeof B не может быть использован как тип для объявления переменной, если B - это значение, а не тип. TypeScript различает пространства имён для типов и значений, и typeof работает только в пространстве типов.

На практике

На практике typeof используется для:

  • Получения типа существующей переменной или константы
  • Создания type alias на основе значения объекта
  • Вывода типа функции или класса

Ошибки возникают, когда:

  • Пытаются использовать typeof с несуществующей переменной
  • Используют typeof в runtime-контексте, где ожидается JavaScript оператор
  • Путают typeof в позиции типа и в позиции значения

Пример кода

TYPESCRIPT
// Правильное использование
const user = { name: "Alice", age: 30 };
type UserType = typeof user; // { name: string; age: number }
// Ошибка: нельзя использовать typeof B как тип напрямую
// const x: typeof B = 42; // B не определена
// Правильно: сначала определить B
const B = 42;
const x: typeof B = 100; // x: number
// Ошибка: typeof в runtime
const typeName = typeof B; // "number" (строка)
// typeName: string, а не number

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

Начните с чёткого разграничения двух контекстов typeof в TypeScript. Объясните, что в позиции типа это type query, а в позиции значения - JavaScript оператор. Приведите примеры правильного и неправильного использования. Упомяните, что TypeScript компилирует type query на этапе компиляции, а JavaScript оператор - в runtime. Подчеркните, что typeof B как тип работает только если B - это значение, известное на этапе компиляции, и используется в type annotation или type alias.

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

Интервьюер проверяет:

  • Понимание разницы между пространствами типов и значений в TypeScript
  • Знание механизма type query и его ограничений
  • Умение различать compile-time и runtime контексты
  • Понимание, как TypeScript обрабатывает typeof в разных позициях
  • Способность объяснить сложную концепцию простыми словами

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

  • Путаница между typeof как type query и typeof как JavaScript оператором
  • Попытка использовать typeof с несуществующей переменной
  • Использование typeof в runtime-контексте, где ожидается тип
  • Непонимание, что typeof B возвращает тип значения, а не сам тип B
  • Ошибка: считать, что typeof можно использовать для получения типа переменной, которая не определена

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

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