到目前为止,这本手册已经涵盖了作为原子对象的类型。然而,当你建立更多类型的模型时,你会发现自己正在寻找一些工具,这些工具可以让你组成或组合现有的类型,而不是从头开始创建它们。
    交集类型和联合类型是其中的一种方式,您可以通过这种方式来组成类型。
    联合类型
    偶尔,你会遇到一个期望参数是数字或字符串的库。例如,以下面的函数为例。
    在上面的例子中,padLeft的问题在于 它的padding参数的类型是any. 这意味着我们可以用一个既不是数字也不是字符串的参数来调用它,但TypeScript会接受它。
    在传统的面向对象的代码中,我们可以通过创建一个类型的层次结构来抽象这两种类型。虽然这样更明确,但也有点矫枉过正。padLeft 原始版本的一个好处是,我们可以只传入基元。这意味着使用起来简单而简洁。如果我们只是想使用一个已经存在于其他地方的函数,这种新方法也不会有什么帮助。
    我们可以为padding参数使用union类型,而不是any。
    联合类型描述了一个可以是几种类型之一的值。我们用竖条(|)来分隔每一种类型,所以number | string | boolean是一个值的类型,它可以是一个数字、一个字符串或一个布尔值。
    带有共同字段的联合体
    如果我们的值是联盟类型,我们只能访问联盟中所有类型共同的成员。
    联合类型在这里可能有点棘手,但只需要一点直觉就能习惯。如果一个值的类型是 A | B,我们只能确定它有 A 和 B 都有的成员。在这个例子中,Bird有一个名为fly的成员。我们不能确定一个类型为Bird | Fish的变量是否有fly方法。如果这个变量在运行时真的是Fish,那么调用pet.fly()就会失败。
    鉴别联合体
    一个常用的联合技术是有一个使用文字类型的单一字段,你可以用它来让TypeScript缩小可能的当前类型。例如,我们要创建一个由三个类型组成的联合体,它们有一个单一的共享字段。
    上述所有类型都有一个名为state的字段,然后它们也有自己的字段。