如何创建多态方法Javascript?

时间:2018-08-28 13:10:54

标签: javascript angular typescript

我尝试创建一些example

我如何编写updateStepData方法, 如果获取类型为stepOneData的数据,则将更改stepOneData 如果获取类型为stepOneData的数据,将更改stepTwoData吗?

  updateStepData(data: StepOneData | StepTwoData): void {
     Object.keys(data).map(key => {
       // if (data instanceof StepOneData) {
          this.stepOneData[key] = data[key];
       // } 

       // if (data instanceof StepTwoData) {
          this.stepTwoData[key] = data[key];
       // } 
     });
  }

我尝试使用instanceof运算符,但在这里不起作用。

1 个答案:

答案 0 :(得分:1)

我在您的Step1Component中找到了此方法:

onFormChanges(): void {
    this.stepOneForm.valueChanges
      .subscribe((data: StepOneData) => {

        this.registrationService.updateStepData(data);
      });
}

像这样更改它:

onFormChanges(): void {
    this.stepOneForm.valueChanges
      .subscribe((data: StepOneData) => {

        const stepOneData = new StepOneData();

        stepOneData.firstName = data.firstName;
        stepOneData.firstName = data.lastName;      

        this.registrationService.updateStepData(stepOneData);
      });
}

对您的Step2Component进行相同操作

现在您可以使用您在代码中编写的instanceof了:

   if (data instanceof StepOneData) {
    this.stepOneData[key] = data[key];
  } 

  if (data instanceof StepTwoData) {
     this.stepTwoData[key] = data[key];
  } 

=======================================

要使代码可读,您可以将constrcutor添加到您的StepOneData和StepTwoData类中,以初始化其属性,如下所示:

export class StepTwoData {

  constructor(public city:string,public state:string){}

}

以及您的组件中:

 onFormChanges(): void {
    this.stepTwoForm.valueChanges
      .subscribe((data: StepTwoData) => {

        const stepTwoData= new StepTwoData(data.city,data.state);    

        this.registrationService.updateStepData(stepTwoData);
      });
}

=========================

更新:

为了更好的设计,我建议您为每种类型编写两种方法。例如“ UpdateStepOneData”和“ UpdateStepTwoData”。

,如果这些方法中存在共享逻辑,则将其放在名为“ UpdateStepData”的方法中。

UpdateStepOneData(data:StepOneData){

       // Custom Code goes here

       UpdateStepData(...); // Shared Logic goes here

}

UpdateStepTwoData(data:StepTwoData){

       // Custom Code goes here

       UpdateStepData(...); // Shared Logic goes here

}