typescript:推断类型的通用要求

问题描述 投票:0回答:1

问题

您如何推断泛型类的泛型要求(扩展部分中的内容?)>

说明
// UserGivenClassThatCouldHaveAnyGeneric
class A<T extends string> {
  constructor(a: T) {}
}

我如何推断通用T必须扩展string。我需要在条件声明中提供此信息。

我尝试了以下操作

type E<W> = any extends A<infer T> ? W extends T ? A<W> : void : void

E在给定的W不扩展T要求的条件下应该为空,但在给定的情况下应为A。但是,尽管没有显示语法错误警告,但是这根本不起作用。

问题您如何推断泛型类的泛型要求(扩展部分中的内容)?说明// UserGivenClassThatCouldHaveAnyGeneric类A {...] >>

typescript generics type-inference
1个回答
1
投票

我的建议是将E<W>更改为以下内容:

type E<W> = never extends A<infer T> ? [W] extends [T] ? A<W> : void : never

首先,对于大多数类型any,检查类型为any extends X ? Y : Z的条件类型,如Y | Z,最终将被视为并集X。也就是说,any在特殊情况下可以接受条件类型的两个分支。有关此的一些讨论,请参见microsoft/TypeScript#27418。假设您仅尝试使用条件类型的true分支,则最好使用never extends X ? Y : Z。通常,never extends X始终为true,然后结果为Y。另外,如果您不想担心工会混乱,可以将其设置为never,而不是void。类型A | never的计算结果为A,而A | void通常不计算。

© www.soinside.com 2019 - 2024. All rights reserved.