微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

以下代码运行正常。

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 中的类型级计算正在开发中,让我们拭目以待。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。