1. 联合类型和交叉类型
联合类型(Union Types)和交叉类型(Intersection Types)是 TypeScript 中常用的两种高级类型。
- 联合类型:使用
|
操作符将多个类型合并成一个新的类型,表示值可以是这些类型中的任意一种。
type Result = string | number;let value: Result;
value = "hello"; // OK
value = 42; // OK
value = true; // Error,布尔类型不在联合类型 string | number 中
- 交叉类型:使用
&
操作符将多个类型合并成一个新的类型,表示值同时具有这些类型的所有成员。
interface A {x: number;
}interface B {y: number;
}type AB = A & B;let obj: AB = { x: 1, y: 2 }; // OK
2. 泛型
泛型(Generics)是一种在编写可复用代码时非常有用的工具,它允许我们在定义函数、类或接口时使用参数化类型。
function identity<T>(arg: T): T {return arg;
}let result = identity<string>("hello"); // result 的类型为 string
泛型不仅可以应用于函数,还可以用于类和接口的定义中,从而增加代码的灵活性和复用性。
3. 条件类型
条件类型(Conditional Types)是 TypeScript 2.8 引入的一种高级类型,它允许我们根据某个条件选择不同的类型。
type NonNullable<T> = T extends null | undefined ? never : T;type T1 = NonNullable<string | null>; // T1 的类型为 string
type T2 = NonNullable<number | null>; // T2 的类型为 number
条件类型可以实现一些复杂的类型操作,如从函数类型中提取参数类型、实现映射类型等。
4. 映射类型
映射类型(Mapped Types)允许我们从一个已知的类型创建一个新的类型,通过在原类型的每个属性上进行操作。
interface Person {name: string;age: number;
}type ReadonlyPerson = Readonly<Person>;let person: ReadonlyPerson = { name: "Alice", age: 30 };
person.name = "Bob"; // Error,只读属性不可修改
除了 Readonly,TypeScript 还提供了 Partial、Pick、Record 等常用的映射类型。
5. 类型推断
类型推断(Type Inference)是 TypeScript 中一种重要的特性,它可以根据上下文自动推断变量的类型。
let x = 10; // x 的类型被推断为 number
通过合理利用类型推断,可以使代码更加简洁和易读,同时不失静态类型检查的优势。