如何给函数返回值的函数传递泛型参数呢?

下面的 test 函数返回了一个匿名函数,这个匿名函数接受一个泛型参数。

function test() {
  return function <T>(params: T) {
    return { params }
  }
}

type person = ReturnType<typeof test>

type TypeABC=??  请问这里该如何书写正确的类型才能约束 abc 的值

const abc: TypeABC = test()()

如上图所示,我该如何书写 TypeABC 的类型?

阅读 720
3 个回答

按理说应该是 ReturnType<person>,但这样得到的是 { params: unknown },为什么会这样呢?

snipaste_2024-06-15_10-07-06.png

test() 的返回类型是一个泛型函数,而泛型函数的泛型是需要在执行的时候才知道是什么类型。所以现在不知道 T 是什么,只能是 unknown。由于 test() 声明中不带泛型,所以从直接从 test() 拿不到泛型相关的东西。虽然 ReturnType<ReturnType<typeof test>> 是可以的,但是写起来太麻烦,不妨拆一下:

const fn = test();
type T2 = ReturnType<typeof fn>;

这里 T2 和上图中的 T1 是一样的。不过 fn 本身是一个带泛型的函数,所以可以从这里拿到泛型相关的东西,可以试一下

snipaste_2024-06-15_10-12-06.png

这是参数类型具体化的 fn,如果加上泛型参数:

snipaste_2024-06-15_10-13-38.png

这就是题主需要的 TypeABC<T>(注意,这里是带泛型参数的 TypeABC,要具体化就必须指定具体化的类型,如上面的 T3

接下来,扩展一下。如果想直接从 test() 把里面的类型推导出来……那就需要把泛型声明在 test() 上去。

snipaste_2024-06-15_10-27-11.png


注:上面用了一个相对简单的办法。也许可以通过类型推导 (infer) 把需要的类型计算出来,但我比较懒,不想去费脑壳,所以静待类型推导的答案。

为啥总是差一丢丢就OK呢,命名关键的部分你都写出来了。

function test<T>() {
  return function (params: T): {params: T} {
    return {params};
  }
}
const a = test<number>()(5);
function test() {
  return function <T>(params: T) {
    return { params }
  }
}

type person = ReturnType<typeof test>

type TypeABC= { params:any }

const abc: TypeABC = test()(123)
推荐问题
logo
Microsoft
子站问答
访问
宣传栏