[英]Typescript: wrong generic inference with function default parameters
我正在尝试向 function 添加类型,它采用 Promise 和可选的修饰符。
function 与此类似:
const identity = <T>(v: T) => v;
const asyncWrapper = async <
PromiseReturn,
ModifierReturn = PromiseReturn
>(
asyncAction: () => Promise<PromiseReturn>,
modifier: (original: PromiseReturn) => ModifierReturn = identity
) => {
const promiseResult = await asyncAction();
return modifier(promiseResult);
};
目标是:调用一个 promise。如果传递了 optional 修饰符,则修改 promise 结果,否则只返回 promise 结果。
但不幸的是, modifier
引发了以下类型错误:
Type '<T>(v: T) => T' is not assignable to type '(original: PromiseReturn) => ModifierReturn'.
Type 'PromiseReturn' is not assignable to type 'ModifierReturn'.
'ModifierReturn' could be instantiated with an arbitrary type which could be unrelated to 'PromiseReturn'.
我认为错误是关于identity
是类型a -> a
而修饰符是类型a -> b
,但我不明白为什么会引发它,因为ModifierReturn
是通用的,并且在identity
的情况下它等于a
。 基本上,当我使用identity
时, a -> ModifierReturn
等于a -> a
。
如果我这样转换identity
:
modifier: (original: PromiseReturn) => ModifierReturn = identity<PromiseReturn> as any
一切正常。
我很难理解为什么 typescript 无法自动推断这些类型。
如果 TypeScript 允许这样做,那么就没有什么可以阻止您编写如下内容:
const ps = asyncWrapper<number, string>(() => Promise.resolve(2));
// ^? Promise<string>
因为,正如 TS 告诉您的那样, ModifierReturn
可以用与PromiseReturn
无关的任意类型实例化。
但那是不合理的,实际上 promise 包含一个number
,而不是一个string
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.