你可能知道Typescript中的Partial实用类型,但事实证明,我们可以通过一些巧妙的递归类型来创建自己的DeepPartial类型。
TL;DR
如果你只是想要这个类型,它就在这里!如果你想了解更多关于这个问题的信息,请继续阅读!
type DeepPartial<T> = Partial<{ [P in keyof T]: DeepPartial<T[P]> }>;
什么是DeepPartial类型
假设你有一个对象,它的每个属性都有自己的对象。如果我们使用Partial 类型,我们只允许最高级别对象的键的子集,但不允许低级别对象。
如果我们有下面的类型。
type LivingThings = {
animals: {
mammals: {
dogs: 'happy';
cats: 'annoyed';
};
};
plants: {
trees: 'tall';
ferns: 'short';
};
};
而我们试图让下面的打字工作。
const dogs: Partial<LivingThings> = {
animals: {
mammals: {
dogs: 'happy',
},
},
};
就会失败!
这是因为我们允许在最高层有一个部分对象,但在animals 和mammals 键内,我们必须包括所有的东西。
这就是深度局部的用武之地!
编写DeepPartial类型
我们的DeepPartial 类型也将采用一个泛型来指定对象。然而,它不再是我们对象的一个Partial ,而是我们对象的一个Partial ,它的每个键都被映射到自己的一个DeepPartial!
请看我下面的意思。
type DeepPartial<T> = Partial<{ [P in keyof T]: DeepPartial<T[P]> }>;
现在,我们的DeepPartial 打字工作!
const dogs: DeepPartial<LivingThings> = {
animals: {
mammals: {
dogs: 'happy',
},
},
};