为什么列出的通用函数在打字稿上覆盖了自己

时间:2018-08-11 06:58:46

标签: angular typescript generics

我正在尝试使用 IOperation 界面进行一些操作。但是我有一个奇怪的错误。 当我记录操作值或操作结果时,没有问题,但是当我尝试记录接口本身时,我将覆盖操作值和结果。

我的代码在这里:https://stackblitz.com/edit/angular-flpdu1?embed=1&file=src/app/app.component.ts

//app/app.component.ts
import { Component } from '@angular/core';
import { IOperation } from './definitions/operation';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {

  operations: {
    [operationName: string]: IOperation
  }[] = [];

  columns: {
    columnName: string,
    columnOperations: IOperation[]
  }[] = [];

  constructor() {
    let sum: IOperation = {
      operationName: "sum",
      operationFunction: this.sumFunction
    };
    let avg: IOperation = {
      operationName: "avg",
      operationFunction: this.avgFunction
    };
    this.operations["sum"] = sum;
    this.operations["avg"] = avg;
    this.columns = [
      {
        columnName: "column1",
        columnOperations: [this.operations["sum"]]
      },
      {
        columnName: "column2",
        columnOperations: [this.operations["avg"]]
      },
      {
        columnName: "column3",
        columnOperations: []
      },
      {
        columnName: "column4",
        columnOperations: [this.operations["sum"], this.operations["avg"]]
      },
      {
        columnName: "column5",
        columnOperations: []
      }
    ];
    this.doOperation();
  }
  sumFunction(values: number[]): number {
    let result: number = 0;
    values.forEach((i: number) => {
      result += i;
    });
    return result;
  }
  avgFunction(values: number[]): number {
    let result: number = 0;
    values.forEach((i: number) => {
      result += i;
    });
    return result / values.length;
  }
  doOperation(): void {
    let values: number[][] = [
      [1, 2, 3, 4, 5],
      [6, 7, 8, 9, 10],
      [11, 12, 13, 14, 15],
      [16, 17, 18, 19, 10],
      [21, 22, 23, 24, 25],
      [26, 27, 28, 29, 20],
      [31, 32, 33, 34, 35]
    ];
    for (let i = 0; i < this.columns.length; i++) {
      for (let k = 0; k < this.columns[i].columnOperations.length; k++) {
        console.log(i+","+k);

        let gc: number[] = [];
        let gcOperation:IOperation=this.columns[i].columnOperations[k];

        for (let j = 0; j < values.length; j++) { gc.push(values[j][i]); }

        gcOperation.operationValues = gc;

        gcOperation.operationResult = gcOperation.operationFunction(gcOperation.operationValues);
        console.log("correct answer:"+gcOperation.operationResult);//correct answer
        console.log(gcOperation);
        //gcOperation.operationResult is wrong here
      }
    }
  }
}

// /definitions/operation.ts
export interface IOperation {
  operationName: string,
  operationFunction?: Function,
  operationValues?: any[],
  operationResult?: any
}

正如您在控制台中看到的,我登录了 operation.operationResult ,它是正确的。然后我立即记录相同的“操作”,并且它的 operationResult 错误。

我正在使用opera 54.0chrome 68.0。 如果您没有相同的问题(如果仅是我的计算机)

there is what i see

(很抱歉,如果我违反网站的任何规定,这是我的第一个问题,我的英语水平也不是很好。谢谢大家想要帮助我。)

1 个答案:

答案 0 :(得分:0)

在代码执行期间,operationResult的值可能会更改。有时是112,后来是133。

由于您正在记录一个对象引用(不是深层副本),因此在将对象记录到控制台时,这种奇怪的行为很容易发生。 虽然顶部的对象表示形式是您记录时的快照快照,但“打开”对象后的值却是当前值。

您可能希望记录对象的深层副本以验证我的假设(例如,通过使用lodash / jquery的相应功能)