跳到主要内容

工具类

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>;

其他泛型

// 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]