如何给函数返回值的函数传递泛型参数呢?
下面的 test
函数返回了一个匿名函数,这个匿名函数接受一个泛型参数。
function test() {
return function <T>(params: T) {
return { params }
}
}
type person = ReturnType<typeof test>
type TypeABC=?? 请问这里该如何书写正确的类型才能约束 abc 的值
const abc: TypeABC = test()()
如上图所示,我该如何书写 TypeABC
的类型?
回复
1个回答

test
2024-06-18
按理说应该是 ReturnType<person>
,但这样得到的是 { params: unknown }
,为什么会这样呢?
test()
的返回类型是一个泛型函数,而泛型函数的泛型是需要在执行的时候才知道是什么类型。所以现在不知道 T 是什么,只能是 unknown
。由于 test()
声明中不带泛型,所以从直接从 test()
拿不到泛型相关的东西。虽然 ReturnType<ReturnType<typeof test>>
是可以的,但是写起来太麻烦,不妨拆一下:
const fn = test();
type T2 = ReturnType<typeof fn>;
这里 T2
和上图中的 T1
是一样的。不过 fn
本身是一个带泛型的函数,所以可以从这里拿到泛型相关的东西,可以试一下
这是参数类型具体化的 fn
,如果加上泛型参数:
这就是题主需要的 TypeABC<T>
(注意,这里是带泛型参数的 TypeABC
,要具体化就必须指定具体化的类型,如上面的 T3
。
接下来,扩展一下。如果想直接从 test()
把里面的类型推导出来……那就需要把泛型声明在 test()
上去。
注:上面用了一个相对简单的办法。也许可以通过类型推导 (infer) 把需要的类型计算出来,但我比较懒,不想去费脑壳,所以静待类型推导的答案。
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容