【发布时间】:2020-07-08 14:44:07
【问题描述】:
有什么技巧可以“评估”泛型函数的类型吗?
考虑以下几点:
type Arr = <A>() => A[]
type Ev<G, A> = ???
问题: 是否可以填写??? 使得Ev<Arr, A> 等于() => A[]? (与<A>() => A[]相比)
所需行为的更多示例:
Ev<<A>() => A[], number>
// should evaluate to
// () => number[]
Ev<<A>() => string, number>
// should evaluate to
// () => string
Ev<<A>() => [string, A], { some: "thing" }>
// should evaluate to
// () => [string, { some: "thing" }]
问题的简化版本是:我们可以定义
type EvNum<A> = ???
这样
EvNum<
<X>() => X
> // should be `number`
EvNum<
<X>() => X[]
> // should be `number[]`
EvNum<
<X>() => [X, "hi"]
> // should be `[number, "hi"]`
EvNum<
<X>() => SomeGenericType<X>
> // should be `SomeGenericType<number>`
EvNum<
<X>() => "constant"
> // should be `"constant"`
【问题讨论】:
-
您在这里寻找的具体行为是什么?如果你能给出一个更详细的例子会有所帮助,你只是想获取传入的泛型函数的返回类型吗?
-
我添加了一些例子
-
无法弄清楚您要达到的目标。建议您根据您的要求提供一些用例。
-
我感觉您需要能够使用更高种类的类型来执行此操作,因为在某些时候您的
Arr类型(这是Ev类型中的泛型)需要由另一个泛型参数化 - 据我所知 - 在 Typescript 中是不可能的。 -
同意@Xetera,它确实需要参数化的参数化。见这里:github.com/Microsoft/TypeScript/issues/1213
标签: typescript-typings typescript2.0 typescript-generics