← 返回目录

第 3 卷

第 3 / 6 卷日期:

6. 高级类型:联合/交叉/索引类型

表示一个值可以是多种类型之一,用 | 分隔,核心是“或”的关系。

Code block

1// 联合类型:值可以是 string 或 number 2type ID = string | number;

3const id1: ID = "123"; // 合法 4const id2: ID = 123; // 合法

5// const id3: ID = true; // 报错 6

7// 函数参数使用联合类型 8function printId(id: ID) {

9console.log(id);

10}

交叉类型 (Intersection Types)

将多个类型合并为一个类型,用 & 分隔,核心是“且”的关系,常用于组合对象类型。

Code block

1//交叉类型:同时拥有User和Contact的属性
2type User = { name: string };
3type Contact = { phone: string };
4type UserWithContact = User & Contact;

5 6const user: UserWithContact = {

7name: "张三", 8phone: "13800138000" // 必须同时包含两个类型的属性

9};

索引类型 (Indexed Types)

用于动态访问对象的属性类型,核心是 keyof(获取对象所有键的联合类型)和 T[K](获取对象属性的类型)。

Code block

1type User = { 2name: string;

3age: number;

9// T[K]:获取属性对应的类型 10type UserNameType = User["name"]; // string

11type UserAgeType = User["age"]; // number 12

13// 通用取值函数(利用索引类型)

14function getProp<T, K extends keyof T>(obj: T, key: K): T[K] {
15return obj[key];
16}

17

18const user: User = { name: "张三", age: 20 };
19const name = getProp(user, "name");// string类型
20const age = getProp(user, "age");// number类型
21// const wrong = getProp(user, "gender"); //报错:"gender"不是User的键

7. 映射类型 (Mapped Types) 是什么?示例

映射类型是 TS 的高级特性,基于现有类型创建新类型,核心是“遍历原类型的所有属性,修改其特性(如只读、可选)”,语法为 { [K in keyof T]: ... }。

核心语法

  • in:遍历 keyof T 的所有键;

• 内置映射类型: Readonly<T>(只读)、 Partial<T>(可选)、 Required<T>(必

选)、 Pick<T, K>(挑选属性)等。

自定义映射类型示例

Code block

1// 原类型 2type User = {

3name: string;

4age: number;

5};

6

7//自定义只读映射类型(等价于Readonly<User>)
8type ReadonlyUser = {
9readonly [K in keyof User]: User[K];
10};

16type PartialUser = { 17[K in keyof User]?: User[K];

18};

19 20const partialUser: PartialUser = { name: "张三" }; // age 可选,合法

21 22// 进阶:将所有属性类型转为 string

23type Stringify<T> = { 24[K in keyof T]: string;

25};

26 27type StringUser = Stringify<User>;

28// StringUser = { name: string; age: string } 29const strUser: StringUser = { name: "张三", age: "20" }; // 合法

内置映射类型示例

Code block

1type User = { 2name: string;

3age: number;

4};

5 6// Partial:所有属性可选

7type PartialUser = Partial<User>;

8 9// Required:所有属性必选(抵消 Partial)

10type RequiredUser = Required<PartialUser>;

11 12// Pick:挑选指定属性

13type PickUser = Pick<User, "name">; // { name: string } 14

15// Omit:排除指定属性(TS 3.5+)

16type OmitUser = Omit<User, "age">; // { name: string }

8. TypeScript 类型系统与类型推断机制

全站分卷索引 · 6 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷