TypeScrip分布式条件类型 [英] Typescript Distributive Conditional Types

查看:3
本文介绍了TypeScrip分布式条件类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我正在浏览有关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 | CT 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>将分布在联合上,这意味着对于任何类型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...并插入AforT(获取A extends ...A... ? ...A... : ...A...),然后插入BforT(获取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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆