【问题标题】:Typescript: infer generic types in generic type constraint打字稿:在泛型类型约束中推断泛型类型
【发布时间】:2022-11-23 20:06:51
【问题描述】:

我有一个通用接口,它接受一个必须扩展另一个通用类型的类型参数。 例如 :

export interface IPoint<TX, TY>
{
    x: TX;
    y: TY;
}
export interface ISeries<TPoint extends IPoint>
{
    points: Array<TPoint>;
}

在这里,我必须为IPoint指定TX和TY。

我的问题是:有没有办法自动推断这些类型,例如像这样?

export interface ISeries<TPoint extends IPoint<infer TX, infer TY>>
{
    points: Array<TPoint>;
}

我现在发现的唯一方法是添加TX和TY作为ISeries的类型参数,但这很不切实际,因为每次使用接口时我都必须指定这三种类型.

我也可以使用IPoint&lt;any, any&gt;,但是我丢失了关于x 和y 的真实类型的信息。

编辑:为了澄清我想要实现的目标,让我们考虑以下示例:

export interface ISeries<TPoint extends IPoint<infer TX, infer TY>>
{
    points: Array<TPoint>;
    transformYValues?: (yValue: TY) => number;
}

在这里我需要TY来强类型transformYValues。

谢谢你的帮助

【问题讨论】:

  • 如果 this 适合你,请告诉我。请记住,推理机制仅适用于通用条件类型和函数参数
  • 你将如何使用这种类型?我不清楚x 和y 会在哪里提供。通过“推理”,我理解将类型分解为其成分,例如T extends Array&lt;infer U&gt; ? U : never或&lt;U&gt;(a: Array&lt;U&gt;) =&gt; void从Array&lt;Something&gt;中提取U。在第一种情况下,来源是T,在第二种情况下,它是a
  • @captain-yossarianfromUkraine 我编辑了问题以添加用例示例,也许这有助于澄清我的问题。谢谢

标签: typescript typescript-generics


【解决方案1】:

考虑这个例子:

export interface Point<X, Y> {
  x: X;
  y: Y;
}

type Values = string | number

export interface Series<Points extends Point<Values, Values>[]> {
  points: Points;
  transformYValues: (yValue: Points[number]['y']) => number;
}

const inference = <
  X extends Values,
  Y extends Values,
  Points extends Point<X, Y>[]
>(data: Series<[...Points]>) => void 0


inference({
  points: [{ x: 1, y: 2 }, { x: 1, y: 9 }],
  transformYValues: (arg) => {
    arg // 2 | 9
    return 42
  }
})

PLayground

我添加了 Values 类型作为允许的 x 和 y 数据类型的约束。

另外,我添加了一个函数inference,因为类型推断适用于通用条件类型和函数参数。

要推断文字类型x:1 y:2,我使用了variadic tuple types,请参阅[...Points]

【讨论】:

  • @Marc F 你想只允许 number 输入 x 和 y 吗?
  • 我认为这对解决我的问题没有帮助,因为我的接口 ISeries 中需要确切的类型 TY。我编辑了我的原始问题以添加示例
  • @MarcF 进行了更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 2020-12-17
  • 2020-08-03
  • 1970-01-01
相关资源
最近更新 更多