打字稿分布条件类型

时间:2019-03-27 16:36:47

标签: typescript

所以我正在阅读有关打字稿的文档,但无法理解这个概念。

因此,文档指出:-

在分布条件类型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部分。

任何人都可以向我解释一下。 对此的一个示例将不胜感激,对我来说文档中的一个不是很清楚。

2 个答案:

答案 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>将分布在并集上,这意味着对于任何类型的AB,类型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替换为其中的每一个。

好的,我希望现在更有意义。祝你好运!

相关问题