我的应用程序中有一个界面:
interface Asset { id: string; internal_id: string; usage: number; }
这是帖子界面的一部分:
interface Post { asset: Asset; }
我还有一个用于后期草稿的界面,其中资产对象可能仅部分构建
interface PostDraft { asset: Asset; }
我想允许一个PostDraft对象有一个部分资产对象,同时仍然检查那里的属性的类型(所以我不想把它换成any)。
PostDraft
any
我基本上想要一种能够生成以下内容的方法:
interface AssetDraft { id?: string; internal_id?: string; usage?: number; }
无需完全重新定义Asset接口。有没有办法做到这一点?如果不是,那么在这种情况下安排我的类型的聪明方法是什么?
Asset
如果不创建具有可选属性的附加接口,这在 TypeScript < 2.1 中是不可能的;但是,这可以通过在 TypeScript 2.1+ 中使用映射类型来实现。
为此,请使用Partial<T>TypeScript 默认提供的类型。
Partial<T>
interface PostDraft { asset: Partial<Asset>; }
现在所有属性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]; };