类型合并、抽出
一、类型抽出:从现有类型中选择或排除属性
1. Pick<T, K>
- 选择指定属性
typescript
type A = { name: string; age: number; address: string };
// 抽出 name 和 age
type SubsetA = Pick<A, "name" | "age">;
// { name: string; age: number }
1
2
3
4
5
2
3
4
5
2. Omit<T, K>
- 排除指定属性
typescript
type A = { name: string; age: number; address: string };
// 排除 name 和 address,保留 age
type SubsetB = Omit<A, "name" | "address">;
// { age: number }
1
2
3
4
5
2
3
4
5
二、类型合并:在现有类型上扩展新属性
1. 交叉类型 &
- 合并多个类型
typescript
type A = { name: string; age: number };
// 添加 time 属性
type B = A & { time: Date };
// { name: string; age: number; time: Date }
1
2
3
4
5
2
3
4
5
2. 接口继承 extends
- 扩展接口
typescript
interface A { name: string; age: number }
// 继承并新增属性
interface B extends A { time: Date }
// { name: string; age: number; time: Date }
1
2
3
4
5
2
3
4
5
三、完整示例
typescript
// 类型抽出
type User = { id: string; name: string; age: number };
type UserAge = Pick<User, "age">; // { age: number }
type UserWithoutId = Omit<User, "id">; // { name: string; age: number }
// 类型合并
type Timestamp = { createdAt: Date };
type UserWithTime = User & Timestamp;
// { id: string; name: string; age: number; createdAt: Date }
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
四、如何选择?
场景 | 工具 | 示例 |
---|---|---|
保留少量属性 | Pick<T, K> | `Pick<User, "id" |
排除少量属性 | Omit<T, K> | Omit<User, "age"> |
扩展新属性 | & 或 extends | User & { role: string } |
掌握这些工具类型,可以灵活操作 TypeScript 的类型系统!