是否有任何技巧可以“评估”通用功能的类型?
请考虑以下内容:
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> = ???
答案 0 :(得分:1)
关于您的第一个问题,这些被称为高级类型,并且在本答案中不受 Typescript 支持。
更高种类的类型只是“一种类型,它抽象了某种类型,反过来又抽象了另一种类型。”所以如果你想要一个类型,你传入一个类型来抽象地创建一个新类型,这是一个更高级的类型的例子。而这在 TS 中是不可能的。
您不能将第二种类型传递给泛型类型并产生派生类型。
您的最后一个示例(简化版)实际上是 ReturnType,因此不确定您的意思。完全有可能想出。但是你不能做一个自己想出来的类型。
type EvNum<T> = () => T;
type Arr<T> = T[];
function func<T>(param: EvNum<T>): T {
return param();
}
let x1 = func(()=> 4); //number
let x2 = func(()=> [4]); //number[]
let x3 = func(()=> [4, "hi"] as const); //[4, "hi"]
let x4 = func(()=> "constant" as const); //"constant"
let cool: Arr<number> = [4, 5, 6];
let x5 = func(() => cool); //Arr<number>
这通过了您请求的类型
答案 1 :(得分:-1)
如果我对您的理解正确,应该是:
type EV<T> = () => T;
否则,这个问题就没有意义,或者必须更详细地解释。