【问题标题】:how to set default Function in this typescript code如何在此打字稿代码中设置默认功能
【发布时间】:2021-04-03 21:16:16
【问题描述】:

以下代码运行正常。

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])
}

类型 '(v: T[K]) => T[K]' 不能分配给类型 'P'。 '(v: T[K]) => T[K]' 可分配给'P' 类型的约束,但'P' 可以用不同的约束子类型'(v: T[K]) = > 任何'。

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

【问题讨论】:

  • 为什么泛型类型是整个函数,而不是它的返回值:function test&lt;T, K extends keyof T, R&gt;(item: T, key: K, transform: (T[K]) =&gt; R = v =&gt; v): R
  • 至少one of these 应该回答你的问题。基本上,这就是错误所说的:可以调用test,这样v =&gt; v 不是transform 的有效实现。您必须使transformv 参数的类型及其返回类型相同。
  • @jonrsharpe 我用function test&lt;T extends object, K extends keyof T, R&gt;(item: T,key: K,transform: (v: T[K]) =&gt; R = v =&gt; v): R 试过,错误是Type 'T[K]' is not assignable to type 'R' Typescript 试图让 T[K] = R

标签: javascript typescript types constraints


【解决方案1】:

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

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

【讨论】:

  • 我试过这个结果,这会丢失 ReturnType 并使test 返回any
  • 目前,我使用了很多 Function delcare 和一些 @ts-ignore 来完成这个动作
猜你喜欢
  • 2016-02-10
  • 2015-02-13
  • 2019-04-21
  • 1970-01-01
  • 2023-01-09
  • 2018-09-01
  • 2021-11-05
  • 1970-01-01
  • 2019-10-29
相关资源
最近更新 更多