问题描述
以下代码运行正常。
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])
}
但是当我将默认函数设置为 param transform
时,它会出错
function test<T extends object,transform: P = v => v
): ReturnType<P> {
return transform(item[key])
}
类型 '(v: T[K]) => T[K]' 不能分配给类型 'P'。 '(v: T[K]) => T[K]' 可分配给类型为 'P' 的约束,但可以使用不同的约束子类型 '(v: T[K]) = 实例化 'P' > 任何'。
正常运行它解决方法
没有必要敢于使用类型级计算。编写具体类型就足够了。
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
。为此,following code is inferred correctly:
function test2(_: ((x:any) => number) extends ((x:any) => any) ? number : string = 1){
}
关键字 infer
只用于推断类型变量(这可以在 extends
之后使用 ONLY 来输入参数)。
TypeScript 中的类型级计算正在开发中,让我们拭目以待。