在Typescript中创建你自己的DeepPartial类型,允许对象属性的任何子集深入的教程

1,056 阅读1分钟

你可能知道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',
    },
  },
};

就会失败!

image.png

这是因为我们允许在最高层有一个部分对象,但在animalsmammals 键内,我们必须包括所有的东西。

这就是深度局部的用武之地!

编写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',
    },
  },
};

image.png