TypeScript类中未更新“ this”

时间:2018-09-25 14:42:55

标签: javascript typescript

我正在尝试使用一种方法将Error类型的对象添加到数组中。所以这是我的代码:

export type Error{
    types: string[];
    message: string;
}

export class Form {
    [k: string]: any;
    id: string;
    errors: Error[];

    constructor(obj?: Form) {
      this.id = '';
      if (obj) {
            Object.assign(this, obj);
            if (obj.errors) {
                this.errors = obj.errors.map(x => ({...x}));
            }
      }
    }

    public addError = (error: Error) => {
        this.errors.push(error);
    }
}

如果我确实创建了一个新的Form并向其中添加一个Error,则错误数组不会更新!!!

const form1 = {errors: []};
const form2 = new Form(form1);
form2.addError ({types: ['a'], message: 'error'});
//form2.errors.length returns 0

我要创建Form的新实例,因为我想在构造函数中处理深层复制。

我在这里想念东西吗?

3 个答案:

答案 0 :(得分:1)

您的代码存在多个问题,这些问题应显示为编译时错误:

  • type关键字希望其后的名称后面带有等号。如果它是一类,那么您可以删除等号。

  • 如果您的类带有方法,并且想将其作为变量传递,则应该

    • 使用new
    • 在您使用的对象文字中包含所有已定义的方法和属性。
  • 或者,如果您想要的只是属性,请使用一个接口,如下文所述。

export type Error = {
    types: string[];
    message: string;
}

export interface IForm {
    [k: string]: any;
    id: string;
    errors: Error[];
}

export class Form implements IForm {
    [k: string]: any;
    id: string;
    errors: Error[];

    constructor(obj?: IForm) {
      this.id = '';
      if (obj) {
            Object.assign(this, obj);
            if (obj.errors) {
                this.errors = obj.errors.map(x => ({...x}));
            }
      }
    }

    public addError = (error: Error) => {
        this.errors.push(error);
    }
}

const form1: IForm = { errors: [], id: 'form1'};
const form2 = new Form(form1);
form2.addError({types: ['a'], message: 'error'});
console.log(form2.errors.length);

答案 1 :(得分:0)

我无法使用您提供的代码进行复制。在此屏幕截图中,您可以看到form2.errors是其中包含预期1元素的数组。 (form1的错误下划线指出form1没有id属性):

enter image description here

答案 2 :(得分:-1)

您的[k: string]: any;正在破坏TypeScript为您提供的安全网。

如果没有它,您将因adderror不能成为事物而出现编译错误,并且TypeScript甚至建议addError作为最有效的替代方案。