泛型约束与工具类型
约 426 字大约 1 分钟
布欧-Lewyon
2026-05-16
首页 › TypeScript › 函数与泛型 › 泛型约束与工具类型
内置工具类型
interface User {
name: string;
age: number;
email: string;
createdAt: Date;
}
// Partial:所有属性可选
type PartialUser = Partial<User>;
// Required:所有属性必选
type RequiredUser = Required<PartialUser>;
// Readonly:所有属性只读
type ReadonlyUser = Readonly<User>;
// Pick:选取部分属性
type UserBasic = Pick<User, 'name' | 'age'>;
// Omit:排除部分属性
type UserWithoutDate = Omit<User, 'createdAt'>;
// Record:字典映射
type PageMap = Record<string, User>;
// Extract:提取联合类型中的子类型
type T0 = Extract<'a' | 'b' | 'c', 'a' | 'f'>; // 'a'
// Exclude:排除联合类型中的子类型
type T1 = Exclude<'a' | 'b' | 'c', 'a'>; // 'b' | 'c'
// NonNullable:排除 null / undefined
type T2 = NonNullable<string | null | undefined>; // string
// ReturnType:函数返回值类型
function fetchUser() { return { name: '张三', age: 28 }; }
type UserType = ReturnType<typeof fetchUser>;
// Parameters:函数参数类型元组
type FetchParams = Parameters<typeof fetchUser>; // []
// Awaited:Promise 展开
type Data = Awaited<Promise<Promise<string>>>; // string泛型默认值
interface Pagination<T = any> {
page: number;
pageSize: number;
total: number;
items: T[];
}
const emptyPage: Pagination = { // T 默认为 any
page: 1, pageSize: 10, total: 0, items: []
};条件约束 + keyof 实战
// 安全的访问器
function safeGet<T, K extends keyof T>(obj: T, key: K): T[K] | undefined {
try { return obj[key]; } catch { return undefined; }
}
// 排除指定键
function withoutKey<T, K extends keyof T>(obj: T, key: K): Omit<T, K> {
const { [key]: _, ...rest } = obj;
return rest;
}小结
| 工具类型 | 作用 |
|---|---|
Partial<T> | 所有属性可选 |
Required<T> | 所有属性必选 |
Pick<T, K> | 选取部分属性 |
Omit<T, K> | 排除部分属性 |
Record<K, V> | 字典类型 |
ReturnType<T> | 函数返回值 |
Parameters<T> | 函数参数元组 |
