gpt4 book ai didi

typescript-typings - typescript : Evaluate type of generic function

转载 作者:行者123 更新时间:2023-12-03 17:24:58 25 4
gpt4 key购买 nike

有什么技巧可以“评估”通用函数的类型吗?

考虑以下:

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"`

最佳答案

至于你的第一个问题,这些被称为高级类型,并且在本答案中不受 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>
这通过了您请求的类型

关于typescript-typings - typescript : Evaluate type of generic function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60893145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com