我们先看下面的这段代码,一个学生接口,里面有成员id,name,age,gender等等成员,
有一个方法graduate,里面要接受一个Student类型的实参
interface Student {
id: number
name: string
age: number
gender: string
}
function graduate(Student: Student) {
//...
}
现在有一个问题,就是学生毕业,可以只需要学生的id其他的都是可选的,
那直接使用Student接口作为实参的约束显然行不通
这时候我们就需要改造一个能使用的来,如下
interface Student {
id: number
name: string
age: number
gender: string
}
interface StudentOptional {
id: number
name?: string
age?: number
gender?: string
}
function graduate(Student: Student) {
//...
}
这样改完,错误就很明显了,代码冗余太多了,如果只是一个类还好,但是实际开发中往往是一个很大的类,所以这种程度的代码冗余是无法接受的
所以我们需要一种更简单的修改,让StudentOptional 就来自于Student,只不过里面的属性约束是可选的
Partial可以实现一部分要求,但是使用Partial之后,StudentOptional 中所有的成员就都是可选的了
但是使用Partial后.,所有约束成员都是可选的了,不符合我们最初的想法,因为id是必须的
而且很遗憾,ts并没有内置这种工具类
所以我们得自己写
type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>
我先不解释为什么这样能实现需求,评论区有知道为什么的吗?