Рекурсивный тип TypeScript 3.7 дает «создание экземпляра типа слишком глубоко и, возможно, бесконечно» - PullRequest
3 голосов
/ 14 октября 2019

Я пытаюсь закодировать переменную pipe функцию, которая составляет произвольное количество чистых функций с одним аргументом. Эта типизация должна проверять, что тип возвращаемого значения одной функции является типом аргумента следующего и т. Д.

Я ожидаю, что это будет работать в TypeScript 3.7, который вводит рекурсивные типы, но почему-то это не работает и даетошибка:

TS2589: type instantiation is excessively deep and possibly infinite

Вот мой код:

type Tail<T extends any[]> = ((...t: T) => void) extends ((x: any, ...u: infer U) => void) ? U : never;

type Pipe<FNS extends unknown[]> = FNS extends [(a: infer A) => infer B, (b: infer B) => infer C] ? C :
                                 FNS extends [(a: infer A) => infer B, (b: infer B) => infer C, Pipe<[...Tail<FNS>[]]>] ? C : never;

Тип FNS представляет массив чистых функций, и тип Tail должен сделатьубедитесь, что возвращается только хвост этого массива, но все же компилятор помечает это как бесконечный цикл.

Пример использования:

const numToString = (n: number): string => n.toString();
const toUpper = (s: string): string => s.toUpperCase();

// this works, Foo evaluates to string
type Foo = Pipe<[typeof numToString, typeof toUpper]>;

// this doesn't work, Foo is not evaluated
type Foo = Pipe<[typeof numToString, typeof toUpper, typeof toUpper]>;

Ошибка в этой части:

Pipe<[...Tail<FNS>[]]>

Почему это бесконечно? Чего мне не хватает?

1 Ответ

1 голос
/ 23 октября 2019

Типы Variadic находятся в будущем дорожная карта , а не часть 3.7.

Это долгожданная функция, которая действительно включит функциональное программирование в

Typescript https://github.com/Microsoft/TypeScript/issues/5453

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...