当前位置: 首页 > 知识库问答 >
问题:

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

闻人花蜂
2023-03-14

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

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

这是后界面的一部分:

interface Post {
  asset: Asset;
}

我还有一个用于后期草稿的接口,其中资产对象可能只是部分构建的

interface PostDraft {
  asset: Asset;
}

我希望允许PostDraft对象具有部分资产对象,同时仍然检查属性的类型(因此我不想用任何替换它)。

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

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

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

共有3个答案

荀增
2023-03-14

接口中的属性要么是可选的,要么不是,你不能使用同一个接口一次作为可选,一次作为必须。

您可以做的是拥有一个包含 AssetDraft 可选属性的接口,然后是一个具有资产必需属性的类:

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

class Asset {
    static DEFAULT_ID = "id";
    static DEFAULT_INTERNAL_ID = "internalid";
    static DEFAULT_USAGE = 0;

    id: string;
    internal_id: string;
    usage: number;

    constructor(draft: AssetDraft) {
        this.id = draft.id || Asset.DEFAULT_ID;
        this.internal_id = draft.internal_id || Asset.DEFAULT_INTERNAL_ID;
        this.usage = draft.usage || Asset.DEFAULT_USAGE;
    }
}

此处的默认值是静态成员,但您可以通过其他方式获取这些值,或者在缺少它们时引发错误。

当处理从服务器接收的json(或类似的东西)时,我发现这种方式非常方便,接口表示JSON数据,类是使用JSON作为初始值构建的实际模型。

养研
2023-03-14

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

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

interface AssetDraft extends Partial<Asset> {}
梅欣然
2023-03-14

这在TypeScript中是不可能的

为此,请使用< code >分部

interface PostDraft {
    asset: Partial<Asset>;
}

现在<code>资产</code>上的所有属性都是可选的,这将允许您执行以下操作:

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

关于<code>部分

部分

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];
};

 类似资料:
  • 总之,是否可以有一个声明某些基属性但不限制其他属性的接口?这是我目前的情况: 我使用的是Flux模式,它定义了一个通用调度器: 然后,我用自己的有效负载类型创建一个调度程序,如下所示: 现在我有了一些动作代码,它应该分派一个带有一些附加数据的有效负载,但是< code>ActionPayload接口只允许< code>actionType。换句话说,这段代码: 给出编译错误,因为与接口不匹配。问题

  • 假设有一个类库X的输入文件,其中包含一些接口。 为了使用这个库,我需要传递一个与。当然,我可以在源文件中创建相同的接口: 但这样一来,我就有了让它和库中的一个保持最新的负担,而且它可能非常大,并导致大量代码重复。 因此,有没有办法“提取”接口的这个特定属性的类型?类似于(这不起作用,导致“找不到名称I2”错误)。 编辑:在TS操场上玩了一会儿后,我注意到以下代码完全实现了我想要的: 但是,它需要声

  • 我在spring-boot项目中有一个properties类。 现在,我想将的application.properties文件中的其他属性设置默认值。与下面的示例使用@value所做的类似

  • 在Enterprise Architect中,可以在特定的关系图中隐藏连接器。开发外接程序(扩展),我需要通过“代码”执行这样的动作,但是我找不到连接器/关系图类的相应属性。 如果有人能帮助找到设置连接器可见性的相关属性,我将不胜感激。

  • 我正在处理一个Spring启动项目,其中传递了许多VM参数供应用程序启动,即证书位置、特定配置文件类型(不是dev、qa、prod等)。0/>file. 问题语句 default.yml中设置的属性仅可访问Spring上下文的环境接口,即org.springframework.core.env.环境,并且属性不会自动/默认设置为系统属性。 I 但是我不想使用环境. getProperty(key)

  • 我有一个带有自定义对象的列表,希望迭代它并将值设置为true/false。