log
码中赤兔

[TS] 实现Optional

发布于 2024年12月20日
更新于 2025年1月5日
5 分钟阅读
TypeScript

在使用 TypeScript 编程时,我们经常需要定义类型来描述数据结构。例如,假设我们有一个名为 Article 的类型,它与数据库中的表结构一致:

export type Article = {
  title: string;
  content: string;
  author: string;
  createdAt: Date;
  updatedAt: Date;
  deletedAt: Date | null;
};

在创建 Article 时,某些字段如 updatedAtdeletedAt 并不是必需的。这时我们通常会定义一个专门用于创建操作的类型,例如:

export type ArticleCreateInput = {
  title: string;
  content: string;
  author: string;
  createdAt: Date;
  updatedAt?: Date;
  deletedAt?: Date | null;
};

虽然这种方法可以解决问题,但它引入了代码冗余。ArticleCreateInputArticle 的定义有大量重复,不仅增加了维护成本,还可能导致代码不易阅读和修改。

使用 TypeScript 特性优化代码

为了解决这个问题,我们可以利用 TypeScript 的高级类型特性来简化代码。通过定义一个通用的 Optional 类型,我们可以动态地将某些字段设为可选:

export type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;

Optional 类型的原理

  • Omit<T, K>:从类型 T 中移除字段 K。
  • Pick<T, K>:从类型 T 中提取字段 K。
  • Partial<Pick<T, K>>:将提取的字段 K 设为可选。
  • 最后通过交集 & 将结果合并为一个新类型。

利用这个工具类型,我们可以轻松创建 ArticleCreateInput 类型,而无需重复定义:

export type ArticleCreateInput = Optional<Article, 'updatedAt' | 'deletedAt'>;

优化后的优势

  1. 减少冗余代码:避免重复定义类型,只需关注需要修改的字段。
  2. 提高可维护性:当 Article 类型发生变化时,相关类型会自动同步更新。
  3. 提高可读性:通过清晰的语义表达字段的差异,代码更加直观。

总结

使用 TypeScript 的工具类型可以有效减少代码冗余并提高可维护性。通过定义通用的 Optional 类型,我们可以轻松地将某些字段设为可选,避免重复定义类似 ArticleCreateInput 的类型。希望这个技巧能为你的项目开发带来便利!

关于

分享技术见解、经验和思考的个人博客

联系方式

  • Email: hushukang_blog@proton.me
  • GitHub

© 2025 码中赤兔. 版权所有