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