在打字稿中传递构造器上的对象?



我有以下代码:

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

我该如何做到这一点?

首先,如果参数可能包含也可能不包含某些属性,则电路板必须具有可选属性。这可以使用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 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 循环实例化对象而不使用它们。

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