初始化所有类属性TypeScript

时间:2015-07-24 08:25:26

标签: typescript

有一个类具有一组相同类型的属性。他们都将成为另一个班级的实例。所以我需要先定义它们然后在构造函数内初始化它们。注意:由于$ window模块,我无法与声明一起执行此操作,该模块仅在constuctor上可用。

我不想一个一个地初始化它们,这只是一个猴子的工作。

这是我的班级:

  export class MyService {
    public signal1: Signal;
    public signal2: Signal;
    public signal3: Signal;
    public signal4: Signal;
    // ...

    /*@ngInject*/
    constructor($window: any) {
      this.signal1 = new $window.signals.Signal();
      this.signal2 = new $window.signals.Signal();
      this.signal3 = new $window.signals.Signal();
      this.signal4 = new $window.signals.Signal();
      // ...
    }
  }

TypeScript版本:1.4.1

问题是:我可以在构造函数中一次初始化所有属性而不重复任何代码吗?

提前谢谢。

3 个答案:

答案 0 :(得分:2)

  

问题是:我可以在构造函数中一次初始化所有属性而不重复任何代码吗?

除非你想牺牲类型安全。例如:

[1,2,3,4].forEach(x=>this['signal'+x] = new $window.signals.Signal());

答案 1 :(得分:1)

嗯,这就是我为完成这项工作所做的工作。感谢@basarat的指示:

  export class MyService {
    // initialize every attribute with null otherwise typescript ignores it
    public signal1: Signal = null;
    public signal2: Signal = null;
    public signal3: Signal = null;
    public signal4: Signal = null;
    // ...

    /*@ngInject*/
    constructor($window: any) {
      // get all properties of "this"
      for (var property in this) {
        if (this.hasOwnProperty(property)) {
          this[property] = new $window.signals.Signal();
        }
      }
    }
  }

所以我现在唯一需要做的就是用null初始化新添加的信号,其他一切都是自动完成的。 Yammy!

答案 2 :(得分:1)

如果满足以下两个条件:

  1. 你有“一些需要成为信号的成员”
  2. 您还有其他成员
  3. 你能做的最好的就是......

    export class MyService {
        public signal1: Signal;
        public signalB: Signal;
        public signalX: Signal;
        public signalY: Signal;
        // ...
        public someOtherProperty: string;
        public andSoOn: string;
    
        /*@ngInject*/
        constructor($window: any) {
            [this.signal1, this.signalB, this.signalX, this.signalY].forEach((s) => {
                s = new $window.signals.Signal();
            });
           // ...
        }
    }
    

    但我的提醒是......你已经删除了重复,但是你让代码更具可读性吗?你需要做出判断。