Gernar
TypeScript

Какие общие типы в TypeScript использовал

Разбор вопроса «Какие общие типы в TypeScript использовал» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.

Вопрос

Какие общие типы в TypeScript использовал

Профессия

Frontend Developer

Что хочет услышать интервьюер

Интервьюер хочет убедиться, что кандидат понимает базовые и продвинутые типы TypeScript, может объяснить их применение в реальных проектах. Важно показать, как типы помогают в разработке: от catching ошибок на этапе компиляции до улучшения читаемости кода.

Ключевые тезисы

  • Примитивные типы: string, number, boolean, null, undefined, symbol, bigint — базовые типы для работы с простыми значениями.
  • Массивы и кортежи: Array<T> или T[] для массивов, [T1, T2] для кортежей с фиксированной длиной и типами элементов.
  • Объекты и интерфейсы: { key: T } или interface для описания структуры объектов, включая опциональные свойства и readonly.
  • Union и Intersection типы: T1 | T2 для объединения типов, T1 & T2 для их пересечения.
  • Generics: Позволяют создавать переиспользуемые компоненты с параметризованными типами, например, Array<T> или Promise<T>.
  • Литеральные типы и type aliases: Конкретные значения как тип (например, 'success' | 'error') и type для создания псевдонимов сложных типов.
  • Функциональные типы: Описание сигнатур функций, включая параметры и возвращаемый тип.

Подробный ответ

TypeScript предоставляет множество встроенных типов, которые помогают разработчикам описывать структуру данных и поведение кода. Основные категории типов включают примитивы (string, number, boolean и др.), массивы и кортежи, объекты и интерфейсы, union и intersection типы, generics, литеральные типы и type aliases, а также функциональные типы. Примитивные типы используются для работы с простыми значениями, такими как строки, числа и булевы значения. Массивы и кортежи позволяют работать с коллекциями данных, причем кортежи фиксируют длину и типы элементов. Интерфейсы и объектные типы помогают описывать сложные структуры данных, включая опциональные и readonly свойства. Union и intersection типы позволяют комбинировать типы для создания более гибких структур. Generics обеспечивают переиспользуемость кода, позволяя параметризовать типы. Литеральные типы и type aliases упрощают работу с конкретными значениями и сложными типами, а функциональные типы описывают сигнатуры функций.

Практические примеры

Пример 1

Пример использования generics: функция, которая принимает массив любого типа и возвращает его первый элемент. Код: `function getFirstElement<T>(arr: T[]): T {
  return arr[0]; }`

Пример 2

Пример union типов: переменная, которая может быть либо строкой, либо числом. Код: `let value: string | number;`

Пример 3

Пример интерфейса с опциональными свойствами: описание пользователя с необязательным полем email. Код: `interface User { name: string; age: number; email?: string; }`

Частые ошибки

  • Использование типа any вместо более конкретных типов, что снижает преимущества TypeScript.
  • Неверное описание типов для кортежей, приводящее к ошибкам при доступе к элементам.

Связанные темы

  • Типизация в React с TypeScript
  • Работа с типами для API-запросов
  • Продвинутые техники типизации: conditional types, mapped types

Follow-up вопросы

Можете привести пример использования generics в вашем проекте?

Уровень: intermediate

Использовал generics для создания универсального компонента-списка, который принимает массив элементов любого типа и рендерит их с помощью переданной функции.

Как вы используете union и intersection типы?

Уровень: intermediate

Union типы применял для обработки различных вариантов состояния (например, 'loading' | 'success' | 'error'), а intersection — для комбинирования типов, например, добавления общих свойств к пользовательским объектам.

Что такое type aliases и зачем они нужны?

Уровень: basic

Type aliases позволяют создавать переиспользуемые псевдонимы для сложных типов, упрощая их использование и поддержку в коде. Например, можно создать тип для объекта пользователя с множеством полей.

Как вы описываете типы для функций в TypeScript?

Уровень: basic

Использую функциональные типы для описания сигнатур функций, например, (arg1: number, arg2: string) => void, чтобы явно указать типы параметров и возвращаемого значения.

Как вы работаете с опциональными свойствами в интерфейсах?

Уровень: basic

Опциональные свойства помечаю знаком '?', что позволяет объектам соответствовать интерфейсу даже без этих свойств. Например, interface User { name: string; age?: number; }.

Содержание