Выбор ответа Senior Условные и mapped-типы обновлено

Глубина рекурсии условных типов

Вопрос

Рекурсивный тип Repeat<S, N> падает с «Type instantiation is excessively deep». Что из этого помогает в TS 4.5+?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Переписать в хвостовую форму с аккумулятором в ветке условия. С TS 4.5 условные типы с хвостовой рекурсией (рекурсивная ссылка непосредственно в ветке, без обёртки вроде [...Repeat<]) вычисляются без роста стека, и лимит глубины намного выше (порядка тысячи итераций).

Варианты ответа

  1. Включить --maxNodeModuleJsDepth с большим значением глубины
  2. Заменить type на interface: интерфейсы раскрываются лениво
  3. Добавить // @ts-ignore над объявлением рекурсивного типа
  4. Переписать в хвостовую форму с аккумулятором в ветке условияправильный ответ

Разбор

С TS 4.5 условные типы с хвостовой рекурсией (рекурсивная ссылка непосредственно в ветке, без обёртки вроде [...Repeat<>]) вычисляются без роста стека, и лимит глубины намного выше (порядка тысячи итераций). Классический приём: тянуть результат в параметре-аккумуляторе. maxNodeModuleJsDepth про JS-файлы в node_modules, interface не умеет условные типы, @ts-ignore не отменяет ошибку вычисления на месте использования.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.