TypeScript的高级类型类型系统支持更多高级特性,如交叉类型、联合类型、类型保护与区分类型、类型别名、字符串字面量类型、多态的this类型、索引类型、映射类型等等。
2023-12-08 20:02:06
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高级类型系统支持的一些特性。这些特性使开发人员能够定义更复杂、更强大的数据结构和算法,从而提高代码质量和可维护性。