Как пройти собеседование по 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 — это проверка не только синтакси