TypeScript 高级类型

104 阅读6分钟

文档(来自 TypeScript 官方文档的“高级类型”章节),以下是从文档中提取的所有明确提到的 TypeScript 高级类型及其相关概念的列表。这些类型和机制是 TypeScript 类型系统的核心部分,用于处理复杂的类型操作和场景。以下是完整的类型列表,并附带简要说明:


1. 交叉类型(Intersection Types)

  • 定义:将多个类型合并为一个类型,包含所有类型的特性。使用 & 操作符。
  • 语法T & U
  • 示例
    type Combined = Person & Serializable & Loggable;
    
  • 用途:常用于混入(mixins)或合并多个类型的属性和方法。
  • 示例代码
    function extend<T, U>(first: T, second: U): T & U;
    

2. 联合类型(Union Types)

  • 定义:表示一个值可以是几种类型之一,使用 | 操作符分隔类型。
  • 语法T | U
  • 示例
    type StringOrNumber = string | number;
    
  • 用途:适合值可能是多种类型之一的场景,只能访问所有类型共有的成员。
  • 示例代码
    function padLeft(value: string, padding: string | number);
    

3. 类型保护(Type Guards)

  • 定义:通过运行时检查(如 typeofinstanceof 或自定义类型谓词)缩小联合类型的范围。
  • 种类
    • typeof 类型保护:检查基本类型(如 "number""string""boolean""symbol")。
      if (typeof padding === "number") { ... }
      
    • instanceof 类型保护:通过构造函数检查对象的类型。
      if (padder instanceof SpaceRepeatingPadder) { ... }
      
    • 用户自定义类型保护:通过返回类型谓词(parameterName is Type)定义。
      function isFish(pet: Fish | Bird): pet is Fish {
          return (<Fish>pet).swim !== undefined;
      }
      
  • 用途:在联合类型中明确值的具体类型,以便安全访问特定类型的成员。

4. 可以为 null 的类型(Nullable Types)

  • 定义:通过联合类型显式包含 nullundefined,通常结合 --strictNullChecks 使用。
  • 示例
    let sn: string | null = "bar";
    
  • 用途:在启用 --strictNullChecks 时,防止 nullundefined 意外赋值。
  • 相关特性
    • 可选参数和可选属性:自动包含 | undefined
      function f(x: number, y?: number);
      
    • 类型断言去除 null/undefined:使用 ! 非空断言操作符。
      name!.charAt(0);
      

5. 类型别名(Type Aliases)

  • 定义:为任意类型(包括原始类型、联合类型、元组等)起一个新名字。
  • 语法
    type Name = string;
    type NameOrResolver = Name | NameResolver;
    
  • 特点
    • 不创建新类型,只是引用现有类型。
    • 支持泛型:
      type Container<T> = { value: T };
      
    • 可用于递归类型:
      type Tree<T> = { value: T; left: Tree<T>; right: Tree<T> };
      
    • 不能用于 extendsimplements,与接口有区别。
  • 用途:定义复杂类型、联合类型、元组等,适合不适合用接口描述的场景。

6. 字符串字面量类型(String Literal Types)

  • 定义:指定字符串必须是固定值。
  • 示例
    type Easing = "ease-in" | "ease-out" | "ease-in-out";
    
  • 用途
    • 结合联合类型和类型保护,模拟枚举行为。
    • 用于函数重载:
      function createElement(tagName: "img"): HTMLImageElement;
      function createElement(tagName: "input"): HTMLInputElement;
      

7. 数字字面量类型(Numeric Literal Types)

  • 定义:指定数字必须是固定值。
  • 示例
    function rollDie(): 1 | 2 | 3 | 4 | 5 | 6;
    
  • 用途:限制返回值或参数为特定数字,常用于调试或缩小范围。

8. 枚举成员类型(Enum Member Types)

  • 定义:当枚举成员使用字面量初始化时,每个成员具有特定的单例类型。
  • 示例
    enum Color { Red = "RED", Green = "GREEN" }
    let c: Color.Red; // 类型为字面量 "RED"
    
  • 用途:提供单例类型,结合联合类型使用,增强类型安全性。

9. 可辨识联合(Discriminated Unions)

  • 定义:结合单例类型、联合类型和类型保护,通过一个可辨识的特征(通常是字符串字面量属性)区分联合类型的成员。
  • 要素
    1. 具有单例类型属性的“标签”(如 kind: "square")。
    2. 包含联合类型的类型别名。
    3. 使用类型保护(如 switch 或类型谓词)。
  • 示例
    interface Square { kind: "square"; size: number; }
    interface Rectangle { kind: "rectangle"; width: number; height: number; }
    type Shape = Square | Rectangle | Circle;
    function area(s: Shape) {
        switch (s.kind) {
            case "square": return s.size * s.size;
            case "rectangle": return s.height * s.width;
        }
    }
    
  • 用途:在函数式编程中模拟代数数据类型,确保类型安全和完整性检查。

10. 多态的 this 类型(Polymorphic this Types)

  • 定义:表示某个类或接口的子类型,常用于链式调用(F-bounded 多态性)。
  • 示例
    class BasicCalculator {
        public add(operand: number): this { ... }
    }
    class ScientificCalculator extends BasicCalculator {
        public sin(): this { ... }
    }
    
  • 用途:支持方法链式调用,确保返回类型是当前类的类型,而不是父类。

11. 索引类型(Index Types)

  • 定义:用于处理动态属性名的类型操作。
  • 操作符
    • 索引类型查询(keyof T):获取类型 T 的所有公共属性名的联合类型。
      let personProps: keyof Person; // "name" | "age"
      
    • 索引访问操作符(T[K]):获取类型 T 在键 K 处的属性类型。
      let name: Person["name"]; // string
      
  • 示例
    function getProperty<T, K extends keyof T>(o: T, name: K): T[K];
    
  • 用途:动态访问对象属性,确保类型安全。

12. 索引签名(Index Signatures)

  • 定义:允许对象以任意字符串或数字作为键,定义动态属性的类型。
  • 示例
    interface Map<T> {
        [key: string]: T;
    }
    let keys: keyof Map<number>; // string
    let value: Map<number>["foo"]; // number
    
  • 用途:处理动态键名的对象,结合 keyofT[K] 使用。

13. 映射类型(Mapped Types)

  • 定义:基于现有类型的键(keyof T)动态生成新类型,修改属性修饰符或类型。
  • 语法
    type Readonly<T> = { readonly [P in keyof T]: T[P] };
    type Partial<T> = { [P in keyof T]?: T[P] };
    
  • 常见映射类型
    • Readonly<T>:将所有属性设为只读。
    • Partial<T>:将所有属性设为可选。
    • Pick<T, K>:选取 T 的部分属性。
    • Record<K, T>:创建以 K 为键、值为 T 的对象类型。
  • 示例
    type Nullable<T> = { [P in keyof T]: T[P] | null };
    
  • 用途:批量转换类型属性,创建通用工具类型。

14. 由映射类型进行推断

  • 定义:从映射类型(如 Proxify<T>)推断出原始类型。
  • 示例
    type Proxify<T> = { [P in keyof T]: Proxy<T[P]> };
    function unproxify<T>(t: Proxify<T>): T;
    
  • 用途:拆包映射类型,恢复原始类型,适用于同态映射类型。

15. never 类型(用于完整性检查)

  • 定义:表示不可能的值,常用于完整性检查或类型推断。
  • 示例
    function assertNever(x: never): never {
        throw new Error("Unexpected object: " + x);
    }
    
  • 用途:结合可辨识联合,确保所有分支被处理,捕获遗漏的 case。

总结

以下是从文档中提取的所有高级类型和相关概念的列表:

  1. 交叉类型(Intersection Types)
  2. 联合类型(Union Types)
  3. 类型保护(Type Guards)
    • typeof 类型保护
    • instanceof 类型保护
    • 用户自定义类型保护(类型谓词)
  4. 可以为 null 的类型(Nullable Types)
    • 可选参数和可选属性
    • 非空断言(!
  5. 类型别名(Type Aliases)
  6. 字符串字面量类型(String Literal Types)
  7. 数字字面量类型(Numeric Literal Types)
  8. 枚举成员类型(Enum Member Types)
  9. 可辨识联合(Discriminated Unions)
  10. 多态的 this 类型(Polymorphic this Types)
  11. 索引类型(Index Types)
    • 索引类型查询(keyof T
    • 索引访问操作符(T[K]
  12. 索引签名(Index Signatures)
  13. 映射类型(Mapped Types)
    • Readonly
    • Partial
    • Pick<T, K>
    • Record<K, T>
  14. 由映射类型进行推断
  15. never 类型

这些类型和机制共同构成了 TypeScript 强大的类型系统,支持复杂场景下的类型安全和代码复用。如果需要对某个具体类型深入探讨或查看更多示例,请告诉我!