我的应用程序中有一个接口:

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

这是post界面的一部分:

interface Post {
  asset: Asset;
}

我还有一个用于后期草稿的接口,其中assets资源 对象可能只被部分构造

interface PostDraft {
  asset: Asset;
}

我想允许一个PostDraft对象拥有一个部分assets资源 对象,同时仍然判断那里的属性的类型(所以我不想只是将其与any交换).

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

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

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

推荐答案

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

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

interface PostDraft {
    asset: Partial<Asset>;
}

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

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

About 100

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

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

阅读有关映射类型herein the handbook的更多信息.

Deep Partial

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

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

Typescript相关问答推荐

在控制器中使用@ DeliverGuards时实现循环依赖项时未定义的依赖项

如果存在一处房产,请确保存在其他房产

我可以让Typescript根据已区分的联合键缩小对象值类型吗?

如何在另一个if条件中添加if条件

如何根据参数的值缩小函数内的返回类型?

类型脚本不会推断键的值类型

泛型函数类型验证

类型脚本类型字段组合

如何在TypeScrip中从字符串联合类型中省略%1值

如何 bootstrap TS编译器为类型化属性`T`推断正确的类型?

如何从输入中删除值0

如何在React组件中指定forwardRef是可选的?

无法将从服务器接收的JSON对象转换为所需的类型,因此可以分析数据

如何通过属性名在两个泛型数组中找到匹配的对象?

在Reaction中折叠手风琴

如何从接口中省略接口

有没有办法在Reaction组件中动态导入打字脚本`type`?

在对象数组中设置值

有没有一种简单的方法可以访问Keyboard Shortcuts JSON文件中列出的每个命令的显示名称(标题)?

从泛型对象数组构造映射类型