Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将对象作为函数参数传递_Javascript_Typescript - Fatal编程技术网

Javascript 将对象作为函数参数传递

Javascript 将对象作为函数参数传递,javascript,typescript,Javascript,Typescript,我有类A和类B通过构造函数传递的一些字段,扩展了类A,任务是为类A创建迭代器,使我有可能将其传递给超级方法(使用扩展运算符或任何其他方式)。 Object.entries()对我没有帮助。我怎么做? 我认为这段代码是不言自明的 class A { constructor(public a: string) { } } class B extends A { constructor(public b: string, a: A) { super(...Obje

我有
类A
类B
通过
构造函数传递的一些字段,
扩展了类A
,任务是为
类A
创建
迭代器
,使我有可能将其传递给
超级
方法(使用扩展运算符或任何其他方式)。
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']}
给你两个答案:

  • 回答你的问题,然后

  • 提出不同的方法

回答你的问题 我认为你做不到你所描述的。尽管您可以使用
Symbol.iterator
函数返回您创建的数组的迭代器,其顺序与
的构造函数的参数列表相同:

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.
当然,除了通过以下方式禁用该错误之外,我没有看到解决方法:

…这似乎不是个好主意。(在操场上。)

提出不同的方法 即使您可以这样做,我也不推荐这样做,因为它是脆弱的:如果您更改
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);

Object.entries
返回数组列表,该列表肯定与
a
字符串类型不匹配。不确定您在这里到底期望什么…?@deceze我想找到像参数列表一样传递对象的方法。我知道
Object.entries()
不起作用,所以我询问了任何可能的解决方案您的意思是B应该接受A类对象作为第二个参数而不是其他任何参数吗?或者澄清你的观点question@PranoySarkar是,并返回BI类的扩展实例。BI认为您误解了扩展。您不应该通过传递
A
的实例来扩展它。
A
的扩展实例就是
B
的实例。还要注意的是,
A
的实例没有成员(正如您当前拥有的那样),那么您希望从
Object.entries
中得到什么呢
{a:'a'}
不是
a
的实例,也不是
a
的构造函数定义
a
属性。。。
super(a);