您如何推断泛型类的泛型要求(扩展部分中的内容?)>
// 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
我的建议是将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
通常不计算。