TypeScript内置工具类型(Utility Types)
TypeScript 提供了一系列内置的 工具类型(Utility Types),用于简化常见的类型操作。这些工具类型基于 TypeScript 的泛型和条件类型实现,能够帮助开发者更高效地定义复杂类型。以下是所有内置工具类型的详细说明和示例:
1. Partial<T>
将 T
的所有属性变为可选(相当于添加 ?
修饰符)。
场景:适用于部分更新对象的场景(如表单提交)。
interface User {
id: number;
name: string;
}
type PartialUser = Partial<User>;
// 等价于 { id?: number; name?: string; }
2. Required<T>
将 T
的所有属性变为必选(移除 ?
修饰符)。
场景:确保对象属性必须存在。
interface PartialUser {
id?: number;
name?: string;
}
type RequiredUser = Required<PartialUser>;
// 等价于 { id: number; name: string; }
3. Readonly<T>
将 T
的所有属性变为只读(添加 readonly
修饰符)。
场景:创建不可变对象。
interface User {
id: number;
name: string;
}
type ReadonlyUser = Readonly<User>;
// 等价于 { readonly id: number; readonly name: string; }
4. Record<K, T>
创建一个对象类型,其键为 K
,值为 T
。
场景:定义键值对结构或枚举映射。
type UserRoles = "admin" | "user";
type RolePermissions = Record<UserRoles, boolean>;
// 等价于 { admin: boolean; user: boolean; }
5. Pick<T, K>
从 T
中选取指定的属性 K
(K
是 T
的键的子集)。
场景:仅需对象的部分属性。
interface User {
id: number;
name: string;
age: number;
}
type UserBasicInfo = Pick<User, "id" | "name">;
// 等价于 { id: number; name: string; }
6. Omit<T, K>
从 T
中排除指定的属性 K
(K
是 T
的键的子集)。
场景:排除不需要的属性。
interface User {
id: number;
name: string;
age: number;
}
type UserWithoutAge = Omit<User, "age">;
// 等价于 { id: number; name: string; }
7. Exclude<T, U>
从联合类型 T
中排除可分配给 U
的类型。
场景:过滤联合类型的成员。
type T = string | number | boolean;
type NumericOrBoolean = Exclude<T, string>; // number | boolean
8. Extract<T, U>
从联合类型 T
中提取可分配给 U
的类型。
场景:筛选联合类型的成员。
type T = string | number | boolean;
type StringOrNumber = Extract<T, string | number>; // string | number
9. NonNullable<T>
从 T
中排除 null
和 undefined
。
场景:确保值非空。
type T = string | null | undefined;
type NonNullableT = NonNullable<T>; // string
10. Parameters<T>
获取函数类型 T
的参数类型的元组。
场景:提取函数参数类型。
type Fn = (a: number, b: string) => void;
type Params = Parameters<Fn>; // [a: number, b: string]
11. ConstructorParameters<T>
获取构造函数类型 T
的参数类型的元组。
场景:提取类的构造函数参数类型。
class User {
constructor(id: number, name: string) {}
}
type ConstructorParams = ConstructorParameters<typeof User>; // [id: number, name: string]
12. ReturnType<T>
获取函数类型 T
的返回值类型。
场景:提取函数返回值类型。
type Fn = () => { id: number };
type Return = ReturnType<Fn>; // { id: number }
13. InstanceType<T>
获取构造函数类型 T
的实例类型。
场景:提取类的实例类型。
class User {
id: number;
name: string;
}
type UserInstance = InstanceType<typeof User>; // User
14. ThisParameterType<T>
获取函数类型 T
的 this
参数类型。
场景:提取函数的 this
类型。
function fn(this: { id: number }) {}
type ThisType = ThisParameterType<typeof fn>; // { id: number }
15. OmitThisParameter<T>
移除函数类型 T
的 this
参数。
场景:忽略函数的 this
类型。
function fn(this: { id: number }) {}
type NoThisFn = OmitThisParameter<typeof fn>; // () => void
16. ThisType<T>
标记对象字面量中的 this
类型(需启用 --noImplicitThis
)。
场景:在对象字面量中明确 this
类型。
type User = {
name: string;
greet: () => string;
};
const user: ThisType<User> = {
name: "Alice",
greet() {
return `Hello, ${this.name}`; // this 指向 User 类型
},
};
总结
这些工具类型覆盖了常见的类型操作需求,如属性过滤、联合类型操作、函数类型提取等。结合 TypeScript 的泛型能力,它们能显著提升代码的类型安全性和可维护性。建议结合实际场景灵活使用,并参考 TypeScript 官方文档 深入了解高级用法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通