繁体   English   中英

Typescript:使用 function 默认参数的错误通用推断

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM