工具类
1. 基本修饰工具类型
// 所有属性变为可选
type Partial<T> = {
[P in keyof T]?: T[P];
};
// 所有属性变为必选
type Required<T> = {
[P in keyof T]-?: T[P];
};
// 所有属性变为只读
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
2. 嵌套修饰工具类型
// 深度所有属性可选
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
interface User {
name: string;
address: {
city: string;
zip: number;
};
}
type PartialUser = DeepPartial<User>;
// { name?: string; address?: { city?: string; zip?: number; } }
// 深度所有属性只读
type DeepReadonly<T> = {
readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];
};
3. 选择性修饰工具类型
interface User {
name: string;
age: number;
email: string;
}
// Pick<T, K> - 选择特定属性
type UserBasic = Pick<User, 'name' | 'email'>;
// { name: string; email: string; }
// Omit<T, K> - 排除特定属性
type UserWithoutEmail = Omit<User, 'email'>;
// { name: string; age: number; }
4. 属性特性修改工具类型
// Mutable<T> - 移除只读修饰符(需要自定义)
type Mutable<T> = {
-readonly [P in keyof T]: T[P];
};
interface ReadonlyUser {
readonly name: string;
readonly age: number;
}
type WritableUser = Mutable<ReadonlyUser>;
// { name: string; age: number; }
// NonNullable<T> - 移除 null 和 undefined
type MaybeString = string | null | undefined;
type DefinitelyString = NonNullable<MaybeString>; // string
5. 记录类型工具
type UserMap = Record<string, User>;
// { [key: string]: User; }
type SpecificKeys = Record<'admin' | 'user', User>;
// { admin: User; user: User; }
6. 条件修饰工具类型
// 使某些属性可选
type MakeOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
interface User {
name: string;
age: number;
email: string;
}
type UserWithOptionalEmail = MakeOptional<User, 'email'>;
// { name: string; age: number; email?: string; }
// 条件性添加只读
type MakeReadonly<T, K extends keyof T> = Omit<T, K> & Readonly<Pick<T, K>>;
type UserWithReadonlyName = MakeReadonly<User, 'name'>;
// { readonly name: string; age: number; email: string; }
7. 实用组合工具类型
type T = string | number | boolean;
// 交集
type StringOrNumber = Extract<T, string | number>; // string | number
// 差集
type WithoutBoolean = Exclude<T, boolean>; // string | number
// 并集
type Concurrence<A, B> = A | B;
// 交集
type Intersection<A, B> = A extends B ? A : never;
// 差集
type Difference<A, B> = A extends B ? never : A;
// 补集
type Complement<A, B extends A> = Difference<A, B>;
8. 其他泛型
// Replace 工具类型通常用于替换元组中的某个元素类型
type Replace<T extends any[], U, V> = {
[K in keyof T]: T[K] extends U ? V : T[K];
};
// 使用 Replace 工具类型
type OriginalTuple = [string, number, boolean];
type NewTuple = Replace<OriginalTuple, number, string>;
// NewTuple 的类型为 [string, string, boolean]
9. keyof
keyof 是 TypeScript 中的一个操作符,用于获取一个对象或接口的属性名。例如:
interface User {
name: string;
age: number;
email: string;
}
type UserKeys = keyof User;
// UserKeys 的类型为 "name" | "age" | "email"
keyof 操作符返回一个联合类型,表示对象或接口的所有属性名。
| 表达式 | 含义 |
|---|---|
keyof T | 类型 T 的所有属性名组成的联合类型 |
T[K] | 当 K 是 keyof T 时,表示属性 K 对应的值类型 |
| 常见组合 | K extends keyof T(泛型约束)、[P in keyof T](映射类型) |