【问题标题】:Typescript: Evaluate type of generic function打字稿:评估泛型函数的类型
【发布时间】:2020-07-08 14:44:07
【问题描述】:

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

考虑以下几点:

type Arr = <A>() => A[]

type Ev<G, A> = ???

问题: 是否可以填写??? 使得Ev&lt;Arr, A&gt; 等于() =&gt; A[]? (与&lt;A&gt;() =&gt; 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


【解决方案1】:

如果我理解正确的话应该是:

type EV<T> = () => T;

否则问题没有意义或必须更详细地解释。

【讨论】:

  • 您似乎误读/误解了这个问题。 EV 需要两个类型参数。
【解决方案2】:

至于您的第一个问题,这些被称为更高种类的类型,并且在本答案中不受 Typescript 支持。

A Higher Kinded Type 只是“一种对某种类型进行抽象的类型,然后又对另一种类型进行抽象。”所以如果你想要一个类型,你传入一个类型来抽象地创建一个新类型,这是一个更高种类的类型的例子。而且在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>

这会传递您请求的类型

【讨论】:

  • 感谢您的说明性回答。所以答案似乎是“在 TS 中不可能”。然而,虽然 TS 中没有对 HKT 的原生支持,但仍然很有可能实现 HKT 的(某些功能)。参见例如 (github.com/gcanti/fp-ts)。然而,我没有设法实现的一个特性是类型级别的 lambda 表达式。问题的目的是:如果我们可以将??? 替换为具有所需属性的表达式,则可以在类型级别实现某种形式的 lambda。由于 HKT 可以一起被黑,我希望??? 也是可能的。
猜你喜欢
  • 1970-01-01
  • 2023-02-22
  • 2021-11-26
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 2017-12-14
  • 2019-07-05
  • 1970-01-01
相关资源
最近更新 更多