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 中选取指定的属性 KKT 的键的子集)。
场景:仅需对象的部分属性。

interface User {
  id: number;
  name: string;
  age: number;
}

type UserBasicInfo = Pick<User, "id" | "name">;
// 等价于 { id: number; name: string; }

6. Omit<T, K>

T 中排除指定的属性 KKT 的键的子集)。
场景:排除不需要的属性。

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 中排除 nullundefined
场景:确保值非空。

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>

获取函数类型 Tthis 参数类型。
场景:提取函数的 this 类型。

function fn(this: { id: number }) {}
type ThisType = ThisParameterType<typeof fn>; // { id: number }

15. OmitThisParameter<T>

移除函数类型 Tthis 参数。
场景:忽略函数的 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 官方文档 深入了解高级用法。

posted @   MartinL  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示