我有class A
,其中一些字段通过constructor
和class B
传递,extends class A
的任务是为iterator
创建class A
这使我有可能将其传递给super
方法(使用传播算子或任何其他方式)。
Object.entries()
对我没有帮助。我该怎么做?
我认为这段代码是不言自明的。
class A {
constructor(public a: string) { }
}
class B extends A {
constructor(public b: string, a: A) {
super(...Object.entries(a));
}
}
/** can be new B('b', new A('a'));
* But not the new B('b', 'a') actually
*/
const b = new B('b', { a: 'a' });
console.log(b); // expect to get {b: 'b', a: 'a'}
// actually get {b: 'b', a: ['a', 'a']}
答案 0 :(得分:2)
为您提供两个答案:
回答您的要求,并且
建议一种不同的方法
我认为您无法做到所描述的。尽管您可以让Symbol.iterator
函数返回数组的迭代器,但该数组的迭代器的创建顺序与A
的构造函数的参数列表相同:
class A {
constructor(public a: string) {
}
[Symbol.iterator]() {
return [this.a][Symbol.iterator]();
}
}
...问题是super
调用无法编译,TypeScript抱怨:
super(...a); // Expected 1 arguments, but got 0 or more.
除了使用@ts-ignore
禁用该错误外,我没有看到其他解决方法:
// @ts-ignore
super(...a); // Expected 1 arguments, but got 0 or more.
...这似乎不是一个好主意。 (Live example在操场上。)
即使您可以这样做,我也不建议这样做,因为它很脆弱:如果您更改A
的构造函数中参数的顺序,则需要更改迭代器以使其匹配。保持它们同步将是维护的陷阱。
相反,我希望构造函数能够接受A
的实例并复制其所有属性:
class A {
public a: string = "";
constructor(a: string);
constructor(obj: A);
constructor(x: string|A) {
if (x instanceof A) {
Object.assign(this, x);
} else {
this.a = x;
}
}
}
super
的呼叫将是:
super(a);