[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 时,某些字段如 updatedAt 和 deletedAt 并不是必需的。这时我们通常会定义一个专门用于创建操作的类型,例如:
export type ArticleCreateInput = {
title: string;
content: string;
author: string;
createdAt: Date;
updatedAt?: Date;
deletedAt?: Date | null;
};
虽然这种方法可以解决问题,但它引入了代码冗余。ArticleCreateInput 与 Article 的定义有大量重复,不仅增加了维护成本,还可能导致代码不易阅读和修改。
使用 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'>;
优化后的优势
- 减少冗余代码:避免重复定义类型,只需关注需要修改的字段。
- 提高可维护性:当 Article 类型发生变化时,相关类型会自动同步更新。
- 提高可读性:通过清晰的语义表达字段的差异,代码更加直观。
总结
使用 TypeScript 的工具类型可以有效减少代码冗余并提高可维护性。通过定义通用的 Optional 类型,我们可以轻松地将某些字段设为可选,避免重复定义类似 ArticleCreateInput 的类型。希望这个技巧能为你的项目开发带来便利!