有一个类具有一组相同类型的属性。他们都将成为另一个班级的实例。所以我需要先定义它们然后在构造函数内初始化它们。注意:由于$ 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
问题是:我可以在构造函数中一次初始化所有属性而不重复任何代码吗?
提前谢谢。
答案 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)
如果满足以下两个条件:
你能做的最好的就是......
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();
});
// ...
}
}
但我的提醒是......你已经删除了重复,但是你让代码更具可读性吗?你需要做出判断。