将对象作为函数参数传递

时间:2019-11-05 10:38:15

标签: javascript typescript

我有class A,其中一些字段通过constructorclass 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']}

1 个答案:

答案 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);

Live example on the playground