Избегание затратных операций над типами
Находите и исправляйте глубоко рекурсивные или распределительные типы
«Избегание затратных операций над типами» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Что делает операцию с типами дорогостоящей
Глубоко рекурсивные типы, крупные распределения объединений и сложные цепочки вывода типов заставляют TypeScript создавать множество вариантов типов, что приводит к экспоненциальным замедлениям.
// Expensive: distributes over every member of a large union
type FilterStrings<T> = T extends string ? T : never;
type Result = FilterStrings<string | number | boolean | null | undefined | ...>;Избегайте чрезмерно больших объединений
Объединения с сотнями элементов, например созданные из множества строковых литералов, могут сделать проверку типов очень медленной. Рассмотрите возможность сузить область допустимых значений или использовать строковый тип с проверкой.
// Expensive
type HugeUnion = "a" | "b" | "c" | /* 200 more ... */ "z";
// Better: string with a runtime check
function isValid(s: string): s is ValidString { return VALID_SET.has(s); }Предпочитайте интерфейсы сложным псевдонимам типов
TypeScript кэширует интерфейсы эффективнее, чем пересечения сложных псевдонимов типов. Предпочитайте interface для форм объектов, на которые ссылаются много раз.
// Slow: recomputed union intersection each time
type BigObject = TypeA & TypeB & TypeC & TypeD;
// Fast: interface (cached)
interface BigObject extends TypeA, TypeB, TypeC, TypeD {}Ограничивайте глубину рекурсии
Рекурсивные условные типы обладают большими возможностями, но могут достигать ограничения глубины TypeScript, обычно 100 уровней. Добавьте счетчик глубины, чтобы завершать вычисление раньше.
type Flatten<T, Depth extends number[] = []> =
Depth["length"] extends 10 ? T
: T extends (infer U)[] ? Flatten<U, [...Depth, 0]>
: T;Кэшируйте промежуточные типы
Давайте имена сложным промежуточным типам, чтобы TypeScript мог кэшировать их и повторно использовать вместо пересчета при каждой ссылке.
// Before: recomputed at each use
type MyResult<T> = T extends SomeComplex<infer U> ? Transform<U> : never;
// After: split into named intermediates
type ExtractU<T> = T extends SomeComplex<infer U> ? U : never;
type MyResult<T> = Transform<ExtractU<T>>;Избегайте глубоких отображаемых типов для больших объектов
Применение DeepReadonly к типу очень большого объекта заставляет TypeScript рекурсивно обходить каждое свойство, что требует значительных ресурсов.
// Expensive on 50-property nested objects
type Safe = DeepReadonly<HugeConfig>;
// Better: annotate at creation time with const assertionsИспользуйте ленивое вычисление обобщенных типов
Оборачивание дорогостоящего типа в отложенное вычисление — тип функции, возвращающий этот тип, — откладывает вычисление до фактической необходимости в нем.
// Lazy evaluation via wrapper
type Lazy<T> = () => T;
type ExpensiveLazy = Lazy<DeepReadonly<HugeConfig>>;Предпочитайте явные возвращаемые типы
Явное указание возвращаемых типов функций не позволяет TypeScript повторно выводить их в каждом месте вызова, ускоряя проверку типов.
// Let TypeScript infer (may be slow for complex functions)
function process(data: Input) { return transform(data); }
// Faster: explicit annotation
function process(data: Input): Output { return transform(data); }isolatedDeclarations для параллельной проверки
isolatedDeclarations в TypeScript 5.5+ требует явных возвращаемых типов, что позволяет параллельно проверять типы независимых файлов без полного вывода типов.
// tsconfig.json
{
"compilerOptions": {
"isolatedDeclarations": true
}
}Ссылки на проекты для изоляции
Ссылки на проекты не позволяют TypeScript проверять типы неизменившихся пакетов, что дает наибольший выигрыш в крупных монорепозиториях.
# With project references:
# tsc --build only recompiles packages whose sources changed
# Unchanged packages: declaration files used directlyПовторение: как избегать дорогостоящих типов
Чтобы TypeScript работал быстро, избегайте огромных объединений, кэшируйте промежуточные типы, предпочитайте интерфейсы сложным псевдонимам, ограничивайте глубину рекурсии, используйте явные возвращаемые типы и изолируйте пакеты с помощью ссылок на проекты.
Быстрая проверка
Какой подход помогает TypeScript эффективнее кэшировать форму объекта?
Что вы узнали
К дорогостоящим операциям с типами TypeScript относятся большие объединения, глубокая рекурсия и повторяющийся сложный вывод типов. Оптимизируйте их, кэшируя промежуточные типы, предпочитая интерфейсы, ограничивая размеры объединений и используя ссылки на проекты для монорепозиториев.
Часто задаваемые вопросы
Урок «Избегание затратных операций над типами» бесплатный?
Да — полный текст урока «Избегание затратных операций над типами» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Избегание затратных операций над типами»?
Находите и исправляйте глубоко рекурсивные или распределительные типы Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Избегание затратных операций над типами»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Профилирование медленной компиляции TypeScript
- Избегание затратных операций над типами
- skipLibCheck и изолированные объявления
- Проверка типов в CI: стратегии и инструменты