Медленный tsc в большом проекте
Вопрос
Проверка типов в монорепо идёт 4 минуты, IDE тормозит. Как будете искать причину и ускорять?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Измерить: `tsc --extendedDiagnostics`, `--generateTrace` и анализ трейса
Разбить на project references и собирать `tsc -b` с инкрементальностью, кешировать `.tsbuildinfo` в CI
Явные типы возврата у публичных функций, `isolatedDeclarations` для параллельной генерации деклараций
Упростить тяжёлые типы: огромные union, глубокая рекурсия, пересечения вместо `extends` у интерфейсов
`skipLibCheck`, сужение `include`, отказ от лишних `@types`
Что могут спросить следом
- Что показывает
generateTrace? - Почему интерфейсы с
extendsпроверяются быстрее пересечений? - Что делать с IDE, если CLI уже быстрый?
Разбор
Начинаю с измерения: tsc --extendedDiagnostics покажет время на парсинг, связывание и проверку, число файлов и инстанцирований типов, а --generateTrace даст трейс, по которому видно конкретные тяжёлые типы и файлы. Дальше архитектура: project references, чтобы проверять пакет против .d.ts зависимостей, а не их исходников, и tsc -b с инкрементальной сборкой, причём .tsbuildinfo стоит кешировать в CI. Явные типы возврата у экспортов уменьшают работу по выводу, а isolatedDeclarations позволяет строить декларации параллельно быстрыми инструментами. Точечно: огромные union из шаблонных литералов, глубоко рекурсивные типы, сложные пересечения (интерфейсы с extends кешируются лучше). Плюс гигиена: skipLibCheck, аккуратные include и types. Для IDE помогает то же самое, плюс разбиение на проекты, чтобы tsserver не держал всё сразу.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.