typescript:推断类型的一般要求 问题:
如何推断泛型类的泛型需求(扩展部分中的内容) 解释typescript:推断类型的一般要求 问题:,typescript,generics,type-inference,Typescript,Generics,Type Inference,如何推断泛型类的泛型需求(扩展部分中的内容) 解释 当给定的W没有扩展T所要求的内容时,E应为空,但扩展时应为A。但是,这根本不起作用,尽管没有显示语法错误警告。我的建议是将E更改为类似以下内容: type E<W> = never extends A<infer T> ? [W] extends [T] ? A<W> : void : never type E=从不扩展?[W] 扩展[T]?A:永远不会 首先,一个条件类型,其中选中的类型是any,比如a
当给定的
W
没有扩展T
所要求的内容时,E
应为空,但扩展时应为A。但是,这根本不起作用,尽管没有显示语法错误警告。我的建议是将E
更改为类似以下内容:
type E<W> = never extends A<infer T> ? [W] extends [T] ? A<W> : void : never
type E=从不扩展?[W] 扩展[T]?A:永远不会
首先,一个条件类型,其中选中的类型是any
,比如any扩展X?Y:Z
,对于大多数类型的X
,最终将被评估为联合Y | Z
。也就是说,any
是一种特殊情况,用于接受条件类型的两个分支。有关这方面的一些讨论,请参阅。假设您只是尝试使用条件类型的真正分支,那么最好使用从不扩展X?Y:Z
。通常,从不扩展X
将始终为真,然后结果将为Y
。此外,如果有一种类型你不想把你的工会搞得一团糟,你应该让它永不,而不是无效。类型A | never
的计算结果为A
,而A | void
通常不会
那么让我们更改typee=any扩展A?W和T?A:void:void
到类型E=从不扩展A?W和T?A:void:never
现在剩下的问题是:当W
本身是联合类型时,您想做什么?如果您将E
定义为W extends T
而不是[W]extends[T]
,则它将被视为一个。这意味着如果W
是一种类似a | B | C
的联合类型,那么E
将评估该联合中每个成员的条件并联合结果,产生与E等效的结果。我的建议是将E
更改为以下内容:
type E<W> = never extends A<infer T> ? [W] extends [T] ? A<W> : void : never
type E=从不扩展?[W] 扩展[T]?A:永远不会
首先,一个条件类型,其中选中的类型是any
,比如any扩展X?Y:Z
,对于大多数类型的X
,最终将被评估为联合Y | Z
。也就是说,any
是一种特殊情况,用于接受条件类型的两个分支。有关这方面的一些讨论,请参阅。假设您只是尝试使用条件类型的真正分支,那么最好使用从不扩展X?Y:Z
。通常,从不扩展X
将始终为真,然后结果将为Y
。此外,如果有一种类型你不想把你的工会搞得一团糟,你应该让它永不,而不是无效。类型A | never
的计算结果为A
,而A | void
通常不会
那么让我们更改typee=any扩展A?W和T?A:void:void
到类型E=从不扩展A?W和T?A:void:never
现在剩下的问题是:当W
本身是联合类型时,您想做什么?如果您将E
定义为W extends T
而不是[W]extends[T]
,则它将被视为一个。这意味着,如果W
是一个类似a | B | C
的联合类型,那么E
将评估该联合中每个成员的条件并联合结果,产生与E类似的等效结果?让我知道这对你是否有效,如果有效,我会写出来;否则,请说明它如何无法满足您的需求。祝你好运。@jcalz是的,非常感谢!没有元组它也能工作吗?喜欢吗?视情况而定;你想把E
变成A
还是A | A
?像这样?让我知道这对你是否有效,如果有效,我会写出来;否则,请说明它如何无法满足您的需求。祝你好运。@jcalz是的,非常感谢!没有元组它也能工作吗?喜欢吗?视情况而定;您希望E
成为A
还是A | A
?
type E<W> = never extends A<infer T> ? [W] extends [T] ? A<W> : void : never