使 TypeScript 推断高阶函数的模板参数
Make TypeScript to infer template parameter for higher-order function
我有一些非常简单的函数,它接收函数和参数并使用该参数执行函数。
我写过这样的代码:
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, '');
run in 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);
run in typescriptlang.org repl
有没有办法让它在不改变顺序的情况下工作?为什么打字稿总是尝试从左到右推断类型?
更新:
它似乎在 TypeScript 本身中缺失了一部分:
这是一个有趣的问题。玩了一会儿之后,我想我找到了一个具有正确行为的签名:
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
我真的不知道为什么会这样(也许更熟悉编译器内部的人可以在这里说些更好的话)但也许这足以帮助你取得进步?祝你好运!
我有一些非常简单的函数,它接收函数和参数并使用该参数执行函数。 我写过这样的代码:
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, '');
run in 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);
run in typescriptlang.org repl
有没有办法让它在不改变顺序的情况下工作?为什么打字稿总是尝试从左到右推断类型?
更新:
它似乎在 TypeScript 本身中缺失了一部分:
这是一个有趣的问题。玩了一会儿之后,我想我找到了一个具有正确行为的签名:
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
我真的不知道为什么会这样(也许更熟悉编译器内部的人可以在这里说些更好的话)但也许这足以帮助你取得进步?祝你好运!