首页 > 解决方案 > TypeScript 接口可选参数,但不被视为可选参数

问题描述

我有一个具有可选属性的接口,但它在我的构造函数中设置为默认值,然后用从构造函数的第一个参数传入的值覆盖。如果未设置属性,则使用默认值。

我怎样才能得到它,以便参数在传递给构造函数时仍然是可选的,但是在类中使用时,它被视为已设置。我不想收到以下错误:

对象可能是“未定义的”。

打字稿游乐场

export interface IMain {
  req: string;
  prop?: ISecondary;
}

export interface ISecondary {
  a?: string;
  b?: string;
}
export class ABC {
  public main: Main;

  public constructor(main: Main) {
    this.main.prop = {
      a: "A",
      b: "B",
      ...main.prop
    };
  }

  public doSomething() {
    this.main.prop.a = "Z";
  }
}

new ABC({
  req: 'cat'
});

标签: javascripttypescript

解决方案


一种方法是将属性设为非可选,然后使用 aPartial<IMain>将参数的所有属性设为可选:

export interface IMain {
  prop: ISecondary;
}

export interface ISecondary {
  a?: string;
  b?: string;
}

const ISecondaryDefaults: ISecondary = {
  a: "A",
  b: "B",
};

export class ABC {
  public main: IMain;

  public constructor(main: Partial<IMain>) {
    this.main = {
      ...main,
      prop: {
        ...ISecondaryDefaults,
        ...main.prop,
      },
    };
  }

  public doSomething() {
    this.main.prop.a = "Z";
  }
}

推荐阅读