在开发的时候经常会遇到有一些类型定义需要重复定义,但这样维护起来很麻烦,比如我要创建一个文章,这个文章的属性都是必须的,但是当我们没有传其中的参数时会有默认值,因此这些参数可能就不是必传的,那这样我们就需要定义相同的类型属性两次,实现需求,但是这样维护起来比较麻烦
本文我们定义一个type Optional
,使得无须重新定义接口createArticleOptions
,而是当我们定义接口Article
后,经过Optional
处理后得到上面createArticleOptions
接口,这样我们在代码维护和代码质量各方面都会有提升
interface Article {
title: string;
content: string;
author: string;
date: Date;
readCount: number;
}
type Optional<T, K> = {};
type createArticleOptions = Optional<Article, "">;
/**
* 经过Optional处理后我们得到下面的接口
* interface createArticleOptions {
title: string;
content: string;
author?: string;
date?: Date;
readCount?: number;
}
*/
实现
interface Article {
title: string;
content: string;
author: string;
date: Date;
readCount: number;
}
type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
type createArticleOptions = Optional<Article, "author" | "date" | "readCount">;
function createArticle(options: createArticleOptions) {}
上面的代码就实现了我们期望的结果,如下图
简单解析一下type Optional