我的应用程序中有一个接口(interface):
interface Asset {
id: string;
internal_id: string;
usage: number;
}
这是帖子界面的一部分:
interface Post {
asset: Asset;
}
我还有一个用于后期草稿的界面,其中 Assets 对象可能只是部分构建
interface PostDraft {
asset: Asset;
}
我想允许 PostDraft
对象拥有部分 Assets 对象,同时仍然检查那里的属性的类型(所以我不想只用 any 交换它
)。
我基本上想要一种能够生成以下内容的方法:
interface AssetDraft {
id?: string;
internal_id?: string;
usage?: number;
}
无需完全重新定义 Asset
接口(interface)。有没有办法做到这一点?如果不是,在这种情况下安排我的类型的明智方法是什么?
最佳答案
如果不创建具有可选属性的附加接口(interface),这在 TypeScript < 2.1 中是不可能的;但是,这可以通过在 TypeScript 2.1+ 中使用映射类型来实现。
为此,请使用 Partial<T>
TypeScript 默认提供的类型。
interface PostDraft {
asset: Partial<Asset>;
}
现在asset
上的所有属性是可选的,这将允许您执行以下操作:
const postDraft: PostDraft = {
asset: {
id: "some-id"
}
};
关于Partial<T>
Partial<T>
是defined作为一个映射类型,它使所提供类型中的每个属性都是可选的(使用 ?
标记)。
type Partial<T> = {
[P in keyof T]?: T[P];
};
阅读更多关于映射类型的信息 here和 in the handbook .
深度局部
如果您想要在对象上递归工作的部分实现,那么您可以在 TS 4.1+ 中使用以下类型:
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
关于typescript - 将 Typescript 接口(interface)中的所有属性设为可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39713349/