Как пройти собеседование по TypeScript: топ вопросов

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Как пройти собеседование по TypeScript: топ вопросов

TypeScript прочно занял место одного из самых востребованных инструментов в современной веб-разработке. Если вы готовитесь к техническому интервью, знание основ и продвинутых возможностей TypeScript — обязательное условие. В этой статье мы разберём топ вопросов, которые часто задают на собеседованиях, и дадим примеры кода для закрепления материала.

1. Основные типы и их отличия от JavaScript

На собеседовании вас обязательно спросят про базовые типы TypeScript и их поведение. Главное отличие от JavaScript — статическая типизация. Рассмотрим ключевые моменты.

1.1. Примитивные типы: string, number, boolean

TypeScript добавляет явную аннотацию типов. Например:

let name: string = 'Анна';
let age: number = 30;
let isActive: boolean = true;

Без аннотации TypeScript выводит тип автоматически (type inference).

1.2. Тип any и unknown

any отключает проверку типов — его лучше избегать. unknown — безопасная альтернатива, требует проверки перед использованием:

let data: unknown = 'строка';
// console.log(data.toUpperCase()); // Ошибка!
if (typeof data === 'string') {
  console.log(data.toUpperCase()); // Ок
}

1.3. never и void

  • void — функция ничего не возвращает.
  • never — функция никогда не завершается (бросает ошибку или бесконечный цикл).
function throwError(msg: string): never {
  throw new Error(msg);
}

2. Интерфейсы и типы (interface vs type)

Это один из самых частых вопросов. Оба механизма позволяют описывать структуру объектов, но есть различия.

2.1. Когда использовать interface

  • Для объявления контрактов объектов и классов.
  • Возможность расширения (declaration merging):
interface User {
  name: string;
}
interface User {
  age: number;
}
// User теперь содержит name и age

2.2. Когда использовать type

  • Для объединений (union), пересечений (intersection) и примитивных алиасов.
  • Не поддерживает declaration merging.
type Status = 'active' | 'inactive';
type Person = { name: string } & { age: number };

Вопрос на собеседовании: «Можно ли заменить interface на type?» — Да, но для классов и расширения лучше interface.

3. Дженерики (Generics)

Дженерики позволяют создавать переиспользуемые компоненты, работающие с любыми типами. Это must-have для senior-позиций.

3.1. Простой дженерик-функция

function firstElement<T>(arr: T[]): T {
  return arr[0];
}
const num = firstElement([1, 2, 3]); // number
const str = firstElement(['a', 'b']); // string

3.2. Ограничения дженериков (extends)

function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}
const user = { name: 'Иван', age: 25 };
console.log(getProperty(user, 'name')); // Иван

3.3. Дженерики в интерфейсах

interface Repository<T> {
  getById(id: number): T;
  save(item: T): void;
}

Часто спрашивают: «Зачем нужны дженерики, если есть any?» — Дженерики сохраняют типовую безопасность.

4. Utility Types и продвинутые возможности

Встроенные утилитарные типы (Partial, Required, Pick, Omit) — показатели глубокого понимания TypeScript.

4.1. Partial и Required

interface Task {
  title: string;
  done: boolean;
}
const partialTask: Partial<Task> = { title: 'Купить хлеб' };
const fullTask: Required<Task> = { title: 'Купить хлеб', done: false };

4.2. Pick и Omit

type TaskTitle = Pick<Task, 'title'>; // { title: string }
type TaskWithoutDone = Omit<Task, 'done'>; // { title: string }

4.3. Record и Readonly

type PageInfo = Record<string, string>; // { [key: string]: string }
const config: Readonly<{ api: string }> = { api: 'https://example.com' };
// config.api = 'new'; // Ошибка!

На собеседовании могут попросить реализовать свой Pick или Partial с помощью mapped types и conditional types.

5. Совместимость с JavaScript и настройка проекта

Практические вопросы касаются интеграции TypeScript в существующий JS-проект.

5.1. Файлы .d.ts и declare

Для использования JS-библиотек без типов создают декларации:

// lodash.d.ts
declare module 'lodash' {
  export function shuffle<T>(arr: T[]): T[];
}

5.2. strict: true в tsconfig.json

Включает все строгие проверки: noImplicitAny, strictNullChecks, strictFunctionTypes и др. Это повышает качество кода.

5.3. enum — числовые и строковые

enum Direction {
  Up = 'UP',
  Down = 'DOWN',
}
console.log(Direction.Up); // 'UP'

Строковые enum предпочтительнее для дебага.

Заключение

Собеседование по TypeScript — это проверка не только синтакси

Блоги

Рекомендаций по книгам