typescript - 将 Typescript 接口(interface)中的所有属性设为可选

标签 typescript

我的应用程序中有一个接口(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];
};

阅读更多关于映射类型的信息 herein 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/

相关文章:

javascript - typescript 类型和 .bind

javascript - 如果值为 null,则隐藏 Angular 组件

javascript - 从 api 调用获取文件路径字符串后自动下载 PDF

javascript - 使用 Typescript 中的 Javascript 函数

typescript - 是否可以循环遍历一个接口(interface)中的所有对象来获取键和值?

angular - Ionic 2 Promise 来自服务器的不同数据

angular - 使用 RxJs Pipe 将 Observable 减少为不同的类型

node.js - Typescript 找不到接口(interface)名称,但知道定义的函数

javascript - 我需要根据代码中数组中选择的选项动态打印国家/地区

javascript - 在不转换异步函数的情况下编译 typescript