TypeScrip分布式条件类型 [英] Typescript Distributive Conditional Types
问题描述
所以我正在浏览有关TypeScrip的文档,但我无法理解这个概念。
因此文档说明:-
在分配条件类型的实例化中,T扩展U?X:Y,则条件类型中对T的引用被解析为联合类型的单个组件(即,T指的是条件类型分布在联合类型上之后的单个组件)。此外,X内对T的引用具有附加的类型参数约束U(即,T被认为是可赋给X内的U的)。我无法理解该部分T refers to the individual constituents after the conditional type is distributed over the union type
。
有人能给我解释一下吗? 如能提供类似的示例,我将不胜感激,因为文档中的示例对我来说不是很清楚。
推荐答案
嗯,我刚刚通读了the documentation,对我来说很有意义...我不知道我能不能比这更好地解释它,但我们来看看吧。在以下和...x...
中,表示可能出现x
的某个表达式。
选中类型为裸类型参数的条件类型称为分布式条件类型。
在本例中,类型参数表示generic type parameter,而裸露类型参数是类型表达式,其中类型参数单独出现,而不是某个更复杂的类型表达式的一部分。勾选的类型是出现在extends
之前的类型。让我们来看一些例子:
type A<T> = string extends T ? "yes" : "no"
这不是分布式条件类型。选中的类型为string
,它不是泛型类型参数。type B<T> = {x: T} extends {x: number} ? "yes" : "no"
这不是分布式条件类型。选中的类型为{x: T}
,其中包含类型参数T
,但不是裸类型参数。type C<T> = T extends string ? "yes" : "no"
这是分布式条件类型;勾选的类型为T
,为裸泛型类型参数。
在实例化过程中,分布式条件类型自动分布在联合类型之上。例如,T
的类型参数为A | B | C
的T extends U ? X : Y
的实例化被解析为(A extends U ? X : Y) | (B extends U ? X : Y) | (C extends U ? X : Y)
。
这是distributive属性的本质。如果您有一个定义为分布式条件类型的类型别名F<T>
,如:
type F<T> = T extends ...T... ? ...T... : ...T...
则F<T>
将分布在联合上,这意味着对于任何类型A
和B
,类型F<A | B>
将等同于类型F<A> | F<B>
在分布式条件类型
T extends U ? X : Y
的实例化中,条件类型内对T
的引用被解析为联合类型的单个组件(即T
是指条件类型分布在联合类型上之后的单个组件)。
这是让您困惑的部分,但它只是解释分发如何工作。就是说要评估F<A | B>
,就应该评估F<A> | F<B>
。因此,对于F<A>
,您需要获取F<T> = T extends ...T... ? ...T... : ...T...
并插入A
forT
(获取A extends ...A... ? ...A... : ...A...
),然后插入B
forT
(获取B extends ...B... ? ...B... : ...B...
),然后将它们合并。
让我们来看一个具体的例子:
type D<T> = T extends string ? T : "nope"
这是什么:
type E = D<"a" | "b" | 0 | true>
好的,下面是不是做这件事的方法:
type E = ("a" | "b" | 0 | true) extends string ? ("a" | "b" | 0 | true) : "nope" //👎
type E = "nope" //👎
我只是将"a" | "b" | 0 | true
插入T
而没有分发,这是错误的。以下是正确操作的方法:
type E = D<"a"> | D<"b"> | D<0> | D<true> //👍
type E = ("a" extends string ? "a" : "nope") |
("b" extends string ? "b" : "nope") |
(0 extends string ? 0 : "nope") |
(true extends string ? true : "nope") //👍
type E = ("a") | ("b") | ("nope") | ("nope") //👍
type E = "a" | "b" | "nope" //👍
看,我们取了工会的各个组成部分,并依次用它们替换了T
。
好的,我希望现在说得更有意义了。祝你好运!
这篇关于TypeScrip分布式条件类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!