> Где и как прописать аннотацию типа в TypeScript (TypeScript)

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

Компании: IT-One

Стек: TypeScript

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

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

Аннотации типов в TypeScript прописываются через двоеточие после имени переменной, параметра функции или возвращаемого значения. Для объектов и функций используются интерфейсы, type-алиасы или inline-аннотации. Типы можно задавать в объявлениях переменных (const x: number), параметрах функций (fn(a: string)), возвращаемых значениях ((): boolean), а также через generics (Array<number>). Для сложных структур применяются interface и type.

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

TypeScript предоставляет несколько способов аннотации типов в зависимости от контекста:

  • Переменные: let name: string = "John" - явное указание типа после имени.
  • Параметры функций: function greet(name: string): void - тип после имени параметра.
  • Возвращаемые значения: function add(a: number, b: number): number - тип после круглых скобок.
  • Свойства объектов: { name: string; age: number } - inline или через interface/type.
  • Generics: function identity<T>(arg: T): T - угловые скобки для параметризации.
  • Union и Intersection: string | number, A & B - комбинирование типов.
  • Optional и readonly: name?: string, readonly id: number - модификаторы.

Для повторного использования типов применяются interface (расширяемый, декларативное слияние) и type (aliases, union, intersection, mapped types). Выбор между ними зависит от задачи: interface предпочтителен для объектов и классов, type - для сложных композиций.

На практике

В реальных проектах аннотации типов помогают:

  • Документировать API модулей и компонентов.
  • Обеспечивать type safety при работе с внешними данными (API, JSON).
  • Упрощать рефакторинг через автоматическую проверку типов.
  • Создавать самодокументируемый код.

Типичные сценарии:

  • React компоненты: прописывать типы props через interface или type.
  • Redux: типизировать state, actions, reducers.
  • API-клиенты: создавать типы для запросов и ответов.
  • Utility types: использовать Partial, Pick, Omit для трансформации.

Пример кода

TYPESCRIPT
// Аннотация переменной
const age: number = 30;
// Функция с типизированными параметрами и возвратом
function multiply(a: number, b: number): number {
return a * b;
}
// Interface для объекта
interface User {
readonly id: number;
name: string;
email?: string; // optional
}
// Type alias с union
type Status = "active" | "inactive";
// Generic функция
function getFirst<T>(arr: T[]): T | undefined {
return arr[0];
}
// Использование
const user: User = { id: 1, name: "Alice" };
const status: Status = "active";
const first = getFirst([1, 2, 3]); // number

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

Начни с базового синтаксиса (двоеточие после имени), затем перейди к контекстам (переменные, функции, объекты). Упомяни разницу между interface и type, приведи примеры из практики (React, API). Покажи понимание generics и utility types. Если спросят про advanced - расскажи про conditional types, mapped types, infer. Избегай излишней теории, фокусируйся на практическом применении.

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

  • Понимание синтаксиса и мест применения аннотаций.
  • Умение выбирать между interface и type.
  • Знание generics и их использования.
  • Способность типизировать реальные сценарии (объекты, функции, async).
  • Понимание trade-off между явной типизацией и выведением типов.

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

  • Путать interface и type - не знать, что interface расширяется, а type - нет (в плане declaration merging).
  • Забывать аннотировать возвращаемое значение функции, особенно для сложных типов.
  • Использовать any вместо правильного типа.
  • Не учитывать optional и readonly модификаторы.
  • Переусложнять типы там, где достаточно простого выведения (type inference).

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

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