将 Typescript 接口中的所有属性设为可选

新手上路,请多包涵

我的应用程序中有一个界面:

 interface Asset {
  id: string;
  internal_id: string;
  usage: number;
}

这是帖子界面的一部分:

 interface Post {
  asset: Asset;
}

我还有一个用于后期草稿的界面,其中资产对象可能仅部分构建

interface PostDraft {
  asset: Asset;
}

我想允许 PostDraft 对象具有部分资产对象,同时仍然检查那里的属性的类型(所以我不想只是用 any 交换它) .

我基本上想要一种能够生成以下内容的方法:

 interface AssetDraft {
  id?: string;
  internal_id?: string;
  usage?: number;
}

无需完全重新定义 Asset 接口。有没有办法做到这一点?如果不是,那么在这种情况下安排我的类型的聪明方法是什么?

原文由 jkjustjoshing 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

如果不创建具有可选属性的附加接口,这在 TypeScript < 2.1 中是不可能的;但是,这可以通过在 TypeScript 2.1+ 中使用映射类型来实现。

为此,请使用 TypeScript 默认提供的 Partial<T> 类型。

 interface PostDraft {
    asset: Partial<Asset>;
}

现在 asset 上的所有属性都是可选的,这将允许您执行以下操作:

 const postDraft: PostDraft = {
    asset: {
        id: "some-id"
    }
};

关于 Partial<T>

Partial<T>定义 为一个映射类型,它使得所提供类型中的每个属性都是可选的(使用 ? 标记)。

 type Partial<T> = {
    [P in keyof T]?: T[P];
};

在此处手册中 阅读有关映射类型的更多信息。

深偏

如果您想要在对象上递归工作的部分实现,那么您可以在 TS 4.1+ 中使用以下类型:

 type DeepPartial<T> = {
    [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};

原文由 David Sherret 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果我想要一个明确的 AssetDraft 接口,我会使用 extendsPartial 的组合:

 interface Asset {
  id: string;
  internal_id: string;
  usage: number;
}

interface AssetDraft extends Partial<Asset> {}

原文由 dhilt 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进