打字稿推断的类型不能使用

时间:2020-04-26 08:26:17

标签: typescript

我试图在javascript的函数库上附加类型。

但是当我在目标被评估为目标是Promise的实例之后尝试执行在'then'链上应用fn(任何函数)的函数'go1'时,我遇到了问题

我认为没有错,有足够的线索可以得出fn的类型。

function go1<T, K>(target:T, fn:T extends Promise<infer Val> ? (val:Val)=>K : (val:T)=>K):
    T extends Promise<any>? Promise<K>: K {
    return target instanceof Promise ? target.then(fn) : fn(target) as any
}

虽然带有字符串参数的函数'go1'可以工作,但是当我像下面的Promise参数一样调用'go1'时

const b = go1("anyString", x=>x.Lowercase()) // works; return "anystring"

const promiseString = Promise.resolve("string")
const c = go1(promiseString,x=>x.Lowercase()) // emit error 

typescript在promiseString上发出编译器错误

Argument of type 'Promise<string>' is not assignable to parameter of type 'string'.ts(2345)
_.ts(111, 19): Did you forget to use 'await'?

Mayber在条件类型ot Typescript上存在一些问题。 当我将条件语句从T更改为any时,它也起作用。 但我无法检查fn上的参数类型

fn:T extends Promise<infer Val> ? (val:Val)=>K : (val:any)=>K
const c = go1("string",
               x=>x.Lowercase() //x is any, cannot suppose type)  

1 个答案:

答案 0 :(得分:1)

由于@Hallaha,我在tsconfig.json上发现了一个问题。 strictFunctionTypes选项引起问题。将其从true更改为false后,代码即可工作。

  "strictFunctionTypes": false /* Enable strict checking of function types. */,