以下代码运行正常。
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中的类型级计算正在开发中,让我们期待它