所以我正在阅读有关打字稿的文档,但无法理解这个概念。
因此,文档指出:-
在分布条件类型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
部分。
任何人都可以向我解释一下。 对此的一个示例将不胜感激,对我来说文档中的一个不是很清楚。
答案 0 :(得分:2)
在分布条件类型(比如说type BoxIfObject<T> = T extends object ? Array<T> : T;
)中,当该类型应用于联合(比如说number | { a : string }
)时,就好像条件类型应用于联合的每个组成部分,并且因此,在条件类型T
中将依次引用联合的每个组成部分(因此T
首先是number
,然后T
将是{ a : string }
)
因此,当我们应用BoxIfObject<number | { a : string }>
时,T
将永远不会引用整个联合体number | { a : string }
,而是依次引用每个联合体。基本上BoxIfObject<number | { a : string }> = BoxIfObject<number> | BoxIfObject<{ a : string }> = number | Array<{ a : string }
答案 1 :(得分:2)
嗯,我只是通读了the documentation,这对我来说很有意义……我不知道我能不能比这更好地解释它,但让我们仔细看看。在下文中,...x...
的意思是“ x
可能出现的某些表达方式”。
其中选中的类型为裸类型参数的条件类型称为分布式条件类型。
在这种情况下, type参数表示generic type parameter,而 naked 类型参数是类型表达式,其中type参数单独出现而不是单独出现一些更复杂的类型表达式的一部分。并且选中的类型是出现在extends
之前的类型。让我们看一些例子:
type A<T> = string extends T ? "yes" : "no"
这不是分布式条件类型。选中的类型为string
,这不是通用类型参数。type B<T> = {x: T} extends {x: number} ? "yes" : "no"
这不是分布式条件类型。选中的类型为{x: T}
,其中具有类型参数T
,但不是 naked 类型参数。type C<T> = T extends string ? "yes" : "no"
这是一种分布式条件类型。检查的类型为T
,这是一个赤裸的泛型类型参数。分布条件类型在实例化过程中自动分布在联合类型上。例如,将
T extends U ? X : Y
的类型为A | B | C
的类型为T
的实例化为(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
的{{1}}(以获得T
),然后将A extends ...A... ? ...A... : ...A...
插入{ {1}}(以获得B
),然后将它们合并。
我们来看一个具体的例子:
T
这是什么:
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
替换为其中的每一个。
好的,我希望现在更有意义。祝你好运!