打字稿:评估通用函数的类型

时间:2020-03-27 19:44:01

标签: typescript-typings typescript2.0 typescript-generics

是否有任何技巧可以“评估”通用功能的类型?

请考虑以下内容:

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> = ???

2 个答案:

答案 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;

否则,这个问题就没有意义,或者必须更详细地解释。