返回

TypeScript的高级类型类型系统支持更多高级特性,如交叉类型、联合类型、类型保护与区分类型、类型别名、字符串字面量类型、多态的this类型、索引类型、映射类型等等。

前端

TypeScript的高级类型系统支持更多高级特性,如交叉类型、联合类型、类型保护与区分类型、类型别名、字符串字面量类型、多态的this类型、索引类型、映射类型等等。

交叉类型

交叉类型是将多个类型组合成一个新类型的操作。新类型将包含所有组成类型的成员。例如,下面的代码定义了一个交叉类型Point,它包含了类型number和type String的成员。

type Point = number & string;

let point: Point = 10; // error
let point: Point = "hello"; // error
let point: Point = 10 + "hello"; // ok

联合类型

联合类型是将多个类型组合成一个新类型的操作。新类型将包含所有组成类型的成员。例如,下面的代码定义了一个联合类型Shape,它包含了类型Circle和type Square的成员。

type Shape = Circle | Square;

let shape: Shape = new Circle(); // ok
let shape: Shape = new Square(); // ok
let shape: Shape = "hello"; // error

类型保护与区分类型

类型保护是检查一个值是否属于某个类型的操作。类型区分是检查两个类型是否相同的操作。例如,下面的代码检查了值x是否属于类型number,如果是,则打印出x的值。

function isNumber(x: any): x is number {
  return typeof x === "number";
}

if (isNumber(x)) {
  console.log(x);
}

类型别名

类型别名是为现有类型创建新的名称。例如,下面的代码创建了一个类型别名Point,它与类型number & string相同。

type Point = number & string;

let point: Point = 10 + "hello"; // ok

字符串字面量类型

字符串字面量类型是将字符串值作为类型的操作。例如,下面的代码定义了一个字符串字面量类型Color,它包含了字符串"red"、"green"和"blue"。

type Color = "red" | "green" | "blue";

let color: Color = "red"; // ok
let color: Color = "black"; // error

多态的this类型

多态的this类型是允许this类型根据调用它的对象的类型而改变的操作。例如,下面的代码定义了一个类Person,它有一个方法greet。方法greet可以被Person类的任何实例调用,并且this类型将是Person实例的类型。

class Person {
  public name: string;

  constructor(name: string) {
    this.name = name;
  }

  public greet() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

let person = new Person("John Doe");
person.greet(); // Hello, my name is John Doe

索引类型

索引类型是允许访问对象的属性或数组的元素的操作。例如,下面的代码定义了一个索引类型PersonIndex,它允许访问Person类的任何实例的name属性。

interface PersonIndex {
  [index: string]: string;
}

let person: PersonIndex = {
  name: "John Doe",
  age: 30
};

console.log(person.name); // John Doe

映射类型

映射类型是允许创建新类型的操作,该新类型将现有类型的所有属性映射到新属性。例如,下面的代码定义了一个映射类型PersonMap,它将Person类的所有属性映射到字符串类型。

type PersonMap = {
  [key in keyof Person]: string;
};

let person: PersonMap = {
  name: "John Doe",
  age: "30"
};

console.log(person.name); // John Doe

这些只是TypeScript高级类型系统支持的一些特性。这些特性使开发人员能够定义更复杂、更强大的数据结构和算法,从而提高代码质量和可维护性。