在构造函数中通过构造函数传递对象?

时间:2019-09-14 15:56:20

标签: javascript typescript

我有此代码:

class AxiosResponseBoardType {
    board: {
      [prop:string]: string | string[] | BoardLoadingType | BoardErrorType;
      created_on: string;
      name: string;
      threads: string[];
      updated_on: string;
      _id: string;
      delete_password: string;
      loading: BoardLoadingType;
      error: BoardErrorType;
    };
    constructor(params: {name: string, delete_password: string, id?: string}) {
      for (var fld in params) {
          this.board = {[fld]: fld}

      }
    }
    genUuidV1 = () => uuidv1();
    now = () => new Date().toISOString();
  }

构造函数可以接收可选属性,所以我通过以下代码循环初始化板子:

for (var fld in params) {
  this.board = {[fld]: fld}
}

我如何进行这项工作?

2 个答案:

答案 0 :(得分:0)

可能有一个更好的答案,但由于它是动态的,所以TypeScript ofc无法知道您在for循环中设置的属性。

有多种方法可以解决此问题,例如使用Object.defineProperty(),但我通常会选择类似的方法:

  for (var fld in params) {
      this.board = {[fld]: fld} as any
  }

编辑:

您还可以将[prop:string]之外的所有属性声明为可选属性(但是我想这里只是为了使其正常工作?)。例如:

board: {
      [prop:string]: string | string[] | BoardLoadingType | BoardErrorType;
      created_on?: string;
      name?: string;
      threads?: string[];
      updated_on?: string;
      _id?: string;
      delete_password?: string;
      loading?: BoardLoadingType;
      error?: BoardErrorType;
    };

发生错误的原因是,您告诉打字稿这些属性是绝对必需的,但是您使用for循环实例化了没有它们的对象。

希望这会有所帮助,有兴趣查看其他答案:)

答案 1 :(得分:0)

首先,如果参数可能包含或可能不包含某些属性,则开发板必须具有可选属性。使用Partial泛型类型可以轻松实现:

 board: Partial<{
  [prop:string]: string | string[] | BoardLoadingType | BoardErrorType;
  created_on: string;
  name: string;
  threads: string[];
  updated_on: string;
  _id: string;
  delete_password: string;
  loading: BoardLoadingType;
  error: BoardErrorType;
}>;

现在,如果您打算将params复制到this.board,那很容易:

 // Initialize `this.board` once:
 this.board = {};
 // Then fill it with params or whatever
 Object.assign(this.board, params);

您会注意到id_id确实不匹配...


作为附带说明,您的代码:

for (var fld in params) {
 this.board = {[fld]: fld}
}

根本不起作用。它将在每次迭代时将this.board重置为一个新对象,并且该对象将具有键作为值,例如如果params{ name: "test", deleted_password: "secret" },则this.board将得到{ deleted_password: "deleted_password" }。那可能不是您想要的,而Typescript出于某种原因试图阻止这种情况……