返回

掌握TS内置工具类型,这篇就够了!

前端

工具类型在 TypeScript 中的强大功能

简介

TypeScript 作为 JavaScript 的超集,通过引入类型系统,显著增强了代码的健壮性和可维护性。TS 内置的工具类型提供了便捷且实用的方式来操作和转换类型,进一步提升开发体验。

常用工具类型

TypeScript 提供了多种工具类型,涵盖了各种需求。本文将重点介绍以下常用类型:

  • Partial :将类型的所有属性标记为可选。
  • Required :将类型的所有属性标记为必填。
  • Readonly :将类型的所有属性标记为只读。
  • Pick :从类型中选取指定属性。
  • Omit :从类型中排除指定属性。
  • Record :创建键值对类型。

源码分析

TS 工具类型定义于 lib.d.ts 文件中。让我们逐一分析它们的源码:

Partial

export declare type Partial<T> = {
    [P in keyof T]?: T[P];
};

Partial 类型将类型 T 的所有属性标记为可选,允许这些属性不存在或值为 undefined

Required

export declare type Required<T> = {
    [P in keyof T]-?: T[P];
};

Required 类型与 Partial 相反,将类型 T 的所有属性标记为必填,要求这些属性在实例化时必须存在并具有非 undefined 值。

Readonly

export declare type Readonly<T> = {
    readonly [P in keyof T]: T[P];
};

Readonly 类型将类型 T 的所有属性标记为只读,禁止对其进行赋值操作,保证数据的不可变性。

Pick

export declare type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};

Pick 类型从类型 T 中选取指定的属性 K,创建包含这些属性的新类型。

Omit

export declare type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;

Omit 类型从类型 T 中排除指定的属性 K,创建不包含这些属性的新类型。

Record

export declare type Record<K extends keyof any, V> = {
    [P in K]: V;
};

Record 类型创建一个键值对类型,其中键的类型为 K,值的类型为 V

应用场景

工具类型在实际开发中有着广泛的应用场景:

  • 数据验证 :通过 PartialRequired 强制要求特定属性的存在性。
  • 只读数据 :使用 Readonly 确保数据的不可变性。
  • 类型提取 :利用 PickOmit 提取或排除特定的属性。
  • 映射类型 :利用 Record 创建键值对类型,实现动态数据结构。

代码示例

// 使用 Partial 将所有属性标记为可选
type UserPartial = Partial<{ name: string; age: number; }>;

// 使用 Required 将所有属性标记为必填
type UserRequired = Required<{ name: string; age: number; }>;

// 使用 Readonly 将所有属性标记为只读
type UserReadonly = Readonly<{ name: string; age: number; }>;

// 使用 Pick 选取特定属性
type UserPick = Pick<{ name: string; age: number; }, "name">;

// 使用 Omit 排除特定属性
type UserOmit = Omit<{ name: string; age: number; }, "age">;

// 使用 Record 创建键值对类型
type UserMap = Record<string, number>;

总结

TS 工具类型提供了强大且灵活的方式来操纵和转换类型,极大地提升了代码的健壮性和灵活性。通过理解这些工具类型的用法和源码,开发者可以充分利用它们来增强开发效率和代码质量。

常见问题解答

  1. Partial 和 Required 有什么区别?

    • Partial 将所有属性标记为可选,而 Required 将所有属性标记为必填。
  2. 什么时候使用 Readonly?

    • 当需要确保数据不可变性时,例如配置对象或缓存。
  3. 如何从类型中提取特定属性?

    • 使用 Pick 类型从类型中选取指定的属性。
  4. 如何从类型中排除特定属性?

    • 使用 Omit 类型从类型中排除指定的属性。
  5. Record 类型有什么用?

    • Record 类型创建一个键值对类型,这在表示动态数据结构时非常有用。