如何在此打字稿代码中设置默认功能

问题描述

以下代码运行正常。

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' > 任何'。

如何修改代码以使用方法 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。为此,following code is inferred correctly

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

关键字 infer 只用于推断类型变量(这可以在 extends 之后使用 ONLY 来输入参数)。

TypeScript 中的类型级计算正在开发中,让我们拭目以待。