Skip to content
Shimon's BlogShimon's Blog
主页
杂谈
  • 主页
      • 代码笔记
          • 代码学习教程
              • TypeScript 教程
                  • 基础
                    • 任意值
                      • 内置对象
                        • 函数的类型
                          • 原始数据类型
                            • 声明文件
                              • 对象的类型——接口
                                • 数组的类型
                                  • 类型推论
                                    • 类型断言
                                      • 联合类型
                                        • 简单的例子
                                          • 访问联合类型的属性或方法
                                            • 参考
                                        • 如何学习一门计算机语言

                                      联合类型

                                      Shimon Zhan2022年4月19日
                                      • TypeScript
                                      大约 1 分钟

                                      此页内容
                                      • 简单的例子
                                      • 访问联合类型的属性或方法
                                      • 参考

                                      联合类型(Union Types)表示取值可以为多种类型中的一种。

                                      # 简单的例子

                                      let myFavoriteNumber: string | number;
                                      myFavoriteNumber = "seven";
                                      myFavoriteNumber = 7;
                                      
                                      let myFavoriteNumber: string | number;
                                      myFavoriteNumber = true;
                                      
                                      // index.ts(2,1): error TS2322: Type 'boolean' is not assignable to type 'string | number'.
                                      //   Type 'boolean' is not assignable to type 'number'.
                                      

                                      联合类型使用 | 分隔每个类型。

                                      这里的 let myFavoriteNumber: string | number 的含义是,允许 myFavoriteNumber 的类型是 string 或者 number,但是不能是其他类型。

                                      # 访问联合类型的属性或方法

                                      当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法:

                                      function getLength(something: string | number): number {
                                        return something.length;
                                      }
                                      
                                      // index.ts(2,22): error TS2339: Property 'length' does not exist on type 'string | number'.
                                      //   Property 'length' does not exist on type 'number'.
                                      

                                      上例中,length 不是 string 和 number 的共有属性,所以会报错。

                                      访问 string 和 number 的共有属性是没问题的:

                                      function getString(something: string | number): string {
                                        return something.toString();
                                      }
                                      

                                      联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型:

                                      let myFavoriteNumber: string | number;
                                      myFavoriteNumber = "seven";
                                      console.log(myFavoriteNumber.length); // 5
                                      myFavoriteNumber = 7;
                                      console.log(myFavoriteNumber.length); // 编译时报错
                                      
                                      // index.ts(5,30): error TS2339: Property 'length' does not exist on type 'number'.
                                      

                                      上例中,第二行的 myFavoriteNumber 被推断成了 string,访问它的 length 属性不会报错。

                                      而第四行的 myFavoriteNumber 被推断成了 number,访问它的 length 属性时就报错了。

                                      # 参考

                                      • Advanced Types # Union Typesopen in new window(中文版open in new window)
                                      上次编辑于: 2022/4/19 07:13:07
                                      贡献者: ShimonZhan
                                      上一页
                                      类型断言
                                      Copyright © 2021-present Shimon Zhan