Сделайте TypeScript для вывода параметра шаблона для функции высшего порядка - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть довольно простая функция, которая получает функцию и параметры и выполняет функцию с этими параметрами.Я написал такой код:

type Action<Payload> = (payload: Payload) => any;

type SomeType = string;

declare function execute<Payload>(action: Action<Payload>, payload: Payload);

declare function testFn<P extends SomeType>(payload: P): number;

execute(testFn, '');

запустить в typescriptlang.org repl

Но выдает ошибку:

Argument of type '<P extends string>(payload: P) => number' is not assignable to parameter of type 'Action<{}>'.
  Types of parameters 'payload' and 'payload' are incompatible.
    Type '{}' is not assignable to type 'string'.

Дело в том, что если я изменю порядок аргумента , это заставит машинопись правильно выводить типы:

type Action<Payload> = (payload: Payload) => any;

type SomeType = string;

declare function execute<Payload>(payload: Payload, action: Action<Payload>);

declare function testFn<P extends SomeType>(payload: P): number;

execute('hell yeah!', testFn);

запустить в typescriptlang.org repl

Есть ли способ заставить его работать без изменения порядка?И почему кажется, что машинопись всегда пытается вывести типы слева направо?

UPD:

Кажется, что в самом TypeScript отсутствует часть:

PR сдобавлена ​​эта функция

тот же вопрос на Github

огромное обсуждение по теме

1 Ответ

0 голосов
/ 18 ноября 2018

Это интересная проблема.Немного поиграв с этим, я думаю, что нашел сигнатуру, которая имеет правильное поведение:

declare function execute<P>(action: Action<any> & Action<P>, payload: P): void;

Тип пересечения, кажется, задерживает оценку Action<P> до тех пор, пока не будет выведено P:

execute(testFn, '');  // okay
execute(testFn, 123);  // error, 123 is not a string

Я действительно не знаю, почему это происходит (возможно, кто-то, более знакомый с внутренностями компилятора, может сказать что-то лучше здесь), но, может быть, этого достаточно, чтобы помочь вам добиться прогресса?Удачи!

...