在SAP Spartacus的源代码里我们可以观察到很多Partial的使用场景:
Partial 可以快速把某个接口类型中定义的属性变成可选的(Optional):
interface People {
age: number;
name: string;
}
const Jerry:People = {
age: 10,
name: 'Jerry'
};
const Tom: People = {
name: 'Tom'
}
上述代码会发生编译时错误:
1.ts:11:7 - error TS2741: Property ‘age’ is missing in type ‘{ name: string; }’ but required in type ‘People’.
解决方法:
interface People {
age: number;
name: string;
}
const Jerry:People = {
age: 10,
name: 'Jerry'
};
type AnonymousPeople = Partial<People>;
const tom:AnonymousPeople = {
name: 'Tom'
};
编译之后:
var Jerry = {
age: 10,
name: 'Jerry'
};
var tom = {
name: 'Tom'
};
这个工具类型的实现毫无神奇之处:
type Partial<T> = {
[P in keyof T]?: T[P];
};
我们完全可以自行实现:
interface People {
age: number;
name: string;
}
const Jerry:People = {
age: 10,
name: 'Jerry'
};
type JerryPartial<T> = {
[P in keyof T]?: T[P];
};
type AnonymousPeople = JerryPartial<People>;
const tom:AnonymousPeople = {
name: 'Tom'
};