Вопросы по TypeScript
От базовых типов до условных и mapped-типов: уверенно объясните, как TypeScript сужает типы, и напишете утилиту прямо на собесе.
Проверьте себя: тест по TypeScript
20 вопросов, 10 минут, уровень junior, middle или senior
Базовые типы
Примитивы, any, unknown, never, литералы, type и interface.
Урок: Базовые типы TypeScript за 6 минут 6 мин- Почему any вреден
- any и unknown: где ошибка
- as не проверяет данные
- Что принимает тип {}
- Проверка лишних свойств
- Два interface с одним именем
- Пересечение с конфликтом полей
- Тип строки в let и const
Ещё 17 вопросов и задач
- Тип let от константы
- Тип never
- Обратное отображение enum
- Тип необязательного параметра
- type против interface
- Зачем TypeScript
- string и String
- Структурная типизация
- Branded id: не перепутать UserId и OrderId
- Разбор суммы из формы: Result с кодами ошибок
- Справочник валют через satisfies и суммы по валютам
- Деньги в копейках: branded type и делёж счёта
- as const на вложенном массиве
- type или interface
- Тип unknown
- Функция, возвращающая void
- Где появляется never
Объединения и сужение
Union, typeof, in, instanceof, type guards и дискриминированные объединения.
Урок: Объединения и сужение типов 6 мин- Функция-утверждение
- Функция-утверждение
- Сужение внутри замыкания
- Дискриминированное объединение
- Сужение через равенство
- Как не забыть вариант объединения
- Новый вариант в объединении
- filter и null в TypeScript 5.5+
Ещё 38 вопросов и задач
- Тип в ветке else после in
- Сужение типов без классов
- Неверный type guard
- Типизация данных из API
- Тег без литерального типа
- Сужение типов
- Литеральный тип константы
- Исчерпывающая проверка в функции
- Взаимоисключающие пропсы
- Утверждение непустоты
- Где сохранится литеральный тип
- Сужение по typeof
- Тип элемента из as const
- Дискриминированное объединение
- Пользовательский type guard
- Исчерпывающая проверка
- Проверить без расширения
- Безопасный неизвестный тип
- Сужение по истинности и ноль
- Ответ API как union: loading, error, success
- Assertion function для конфига
- Reducer корзины на discriminated union
- isDefined: filter, который сужает тип
- Безопасный парсинг JSON в тип через type guard
- Конечный автомат платежа с типами переходов
- Площадь фигур: union с разными полями
- Обработка вебхуков: union событий и in-сужение
- Assertion function в стрелочной функции
- Сужение внутри замыканий (TS 5.4)
- Проверка полноты без assertNever
- satisfies, аннотация или as
- Типы на границах системы
- keyof от объединения объектов
- satisfies и расширение литерала
- noUncheckedIndexedAccess и доступ по индексу
- Type predicate
- typeof object и null
- Что остаётся после typeof object
Дженерики
Параметры типов, ограничения extends, вывод и значения по умолчанию.
Урок: Дженерики без страха 6 мин- Модификатор const у параметра типа
- const-параметр типа
- Ограничение extends
- Параметр типа по умолчанию
- Ограничение дженерика
- Что даёт дженерик вместо any
- Результат T[K]
- Безопасный доступ по ключу
Ещё 41 вопрос или задача
- Тип после mapValues
- Дженерик без аргументов вывода
- Тип результата дженерик-функции
- Дженерики
- Почему нельзя вернуть объект как T
- Тип элемента массива
- Ограничение по структуре
- Тип функции
- Дженерик-функция
- Значение параметра типа по умолчанию
- Возврат хука
- Индексная сигнатура
- Необязательное поле
- Тип для children
- Кортеж
- Объединение через type
- Ограничение дженерика
- Доступ по индексу
- keyof
- typeof значения
- Типизированный groupBy по ключу объекта
- keyBy: индекс по id с проверкой дублей
- memoize с сохранением сигнатуры
- partition с type guard
- pick и omit с точными типами
- pipe с перегрузками и выводом типов
- retry, возвращающий Result вместо исключения
- zip с выводом типа кортежа
- strictFunctionTypes: методы и свойства-функции
- NoInfer<T> (TS 5.4)
- Перегрузки и аргумент-объединение
- Аннотации вариантности in и out
- Вариантность в TypeScript
- const-параметр типа (TS 5.0)
- Тип результата Promise.all
- ReturnType у дженерик-функции
- Вывод T из двух аргументов
- Вывод параметров типа
- Типизация groupBy
- Лишний параметр типа
- Зачем нужны дженерики
Утилитарные типы
Partial, Pick, Omit, Record, ReturnType, Awaited и как они устроены.
Урок: Утилитарные типы и как они устроены 6 мин- Awaited и вложенные промисы
- Awaited
- Awaited на объединении
- Capitalize на объединении
- Убрать член объединения
- Как устроены Pick и Omit
- Зачем NoInfer
- Omit на объединении
Ещё 37 вопросов и задач
- Опечатка в Omit и Pick
- Omit и Exclude
- Parameters и необязательный параметр
- Partial не глубокий
- Служебные типы
- Readonly не глубокий
- Record с объединением ключей
- Record
- ReturnType и typeof
- Распаковать промис
- Результат асинхронной функции
- Пропсы чужого компонента
- Extract
- Расширение с заменой поля
- Первый параметр функции
- Частичный словарь
- Неизменяемый массив
- Исчерпывающий словарь
- Исключить из union
- Убрать null и undefined
- Исключить поля
- Типы параметров
- Все поля необязательны
- Выбрать поля
- Только чтение
- Словарь
- Все поля обязательны
- Тип возврата
- Diff объектов: Partial<T> с изменёнными полями
- Типизированный конфиг из process.env
- Мини-zod: тип из схемы через mapped-тип
- Generic-пагинация с метаданными
- PATCH только разрешённых полей
- ReturnType функции с as const
- Тип результата Object.keys
- Parameters у перегруженной функции
- Тип для частичного обновления
Условные и mapped-типы
extends ? :, infer, распределение по объединению, keyof и переназначение ключей.
Урок: Условные и mapped-типы 7 мин- Индекс number без as const
- Условный тип над объединением
- Распределение условных типов
- Дистрибутивный условный тип
- Тип обработчиков из карты событий
- Ключи-методы объекта
- Геттеры через переназначение ключей
- Mapped-тип и необязательные поля
Ещё 34 вопроса и задачи
- infer в шаблонной строке
- infer
- Проверка на never
- Фильтрация ключей через as
- Переназначение ключей
- keyof в шаблонной строке
- Mapped-тип над кортежем
- Как отключить распределение
- DeepPartial
- Только строковые ключи
- Условный тип
- infer у массива
- infer у промиса
- infer у функции
- Поля допускают null
- Снять readonly
- mapped type
- Шаблонный литеральный тип
- Распределение ToArray
- buildPath: параметры маршрута из шаблонной строки
- snake_case в camelCase: ключи и тип
- Префикс ключей: key remapping в mapped-типе
- Парсинг query string в типизированный объект
- Условные типы и infer
- Как отключить распределение условного типа
- infer с ограничением
- Omit на дискриминированном объединении
- Глубина рекурсии условных типов
- Шаблонные литеральные типы и комбинаторный взрыв
- Распределительный условный тип от never
- Только строковые ключи через Extract
- infer последнего элемента кортежа
- Снятие readonly и ? в mapped-типе
- Условный тип без распределения
Классы и интерфейсы
Модификаторы доступа, abstract, implements, структурная типизация.
Урок: Классы и интерфейсы в TypeScript 6 мин- Абстрактный класс
- Экземпляр абстрактного класса
- Что остаётся в JS
- Абстрактный класс или интерфейс
- Инкапсуляция в TypeScript
- implements и типы параметров
- Метод без объекта
- Флаг noImplicitOverride
Ещё 16 вопросов и задач
- Модификатор в параметре конструктора
- Параметры-свойства
- Классы с private и совместимость
- private в рантайме
- private и #private
- Где можно присвоить readonly
- Generic LRU-кеш: класс с параметрами K и V
- Fluent builder SQL-запроса с ключами таблицы
- Типизированный EventEmitter с картой событий
- Типизированный стор с подписками на срезы
- implements не даёт контекстных типов
- override и noImplicitOverride
- Номинальные типы в структурном TypeScript
- private или #private
- Структурная типизация классов
- Тип конструктора класса
tsconfig и декларации
strict-флаги, moduleResolution, .d.ts, declare и расширение модулей.
Урок: tsconfig и файлы деклараций 6 мин- Тип ошибки в catch
- declare global в файле без export
- Ключевое слово declare
- Файл .d.ts
- Добавить поле в Request
- Что запрещает isolatedModules
- Расширение модуля
- noUncheckedIndexedAccess
Ещё 18 вопросов и задач
- Расширение в импорте при nodenext
- Алиасы paths
- skipLibCheck
- Что входит в strict
- target и полифиллы
- erasableSyntaxOnly и type stripping в Node
- exactOptionalPropertyTypes
- Поле exports и типы библиотеки
- Расширение Request в Express
- isolatedDeclarations (TS 5.5)
- isolatedModules и транспиляция по файлу
- Project references в монорепо
- Как запускать TypeScript на бэкенде в 2026
- Что отключает skipLibCheck
- Медленный tsc в большом проекте
- verbatimModuleSyntax
- tsconfig нового проекта
- Библиотека без типов
Задачи на типы
Пишем утилиты типов сами: от DeepReadonly до разбора строк.
Урок: Как решать задачи на типы 7 мин