如何在此类型脚本代码中设置默认函数



以下代码运行正常。

function test<T extends object, K extends keyof T, P extends (v: T[K]) => any>(
item: T,
key: K,
transform: P
): ReturnType<P> {
return transform(item[key])
}

但当我将默认函数设置为参数transform时,它会错误

function test<T extends object, K extends keyof T, P extends (v: T[K]) => any>(
item: T,
key: K,
transform: P = v => v
): ReturnType<P> {
return transform(item[key])
}

Type'(v:T[K](=>T[K]'不可分配给类型'P'。'(v:T[K](=>T[K]'可分配给类型为'P'的约束,但'P'可以用约束的不同子类型实例化'(v:T[K](=>任何"。

如何修改此代码以使用默认方法v => v正常运行

没有必要敢于使用类型级计算。写具体的类型就足够了。

type F<X, Y> = (x: X) => Y 
function test<T extends object, K extends keyof T>(
item: T,
key: K,
transform: F<T[K],any> = v => v
): ReturnType<F<T[K],any>> {
return transform(item[key])
}

TypeScript的推理在激烈的争论中并不那么明智。在这种情况下,编译器无法推断出类型良好的变量P。为了证明这一点,以下代码被正确地推断出来:

function test2(_: ((x:any) => number) extends ((x:any) => any) ? number : string = 1){
}

有关键字infer只能一直推断类型变量(在键入参数时,可以在extends之后使用only(。

TypeScript中的类型级计算正在开发中,让我们期待它

最新更新