我试图在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)
答案 0 :(得分:1)
由于@Hallaha,我在tsconfig.json上发现了一个问题。 strictFunctionTypes选项引起问题。将其从true更改为false后,代码即可工作。
"strictFunctionTypes": false /* Enable strict checking of function types. */,