我有此代码:
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}
}
我如何进行这项工作?
答案 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出于某种原因试图阻止这种情况……