在打字稿中传播语法

时间:2017-07-05 17:34:27

标签: angular typescript ecmascript-6

我正在尝试在Angular项目中扩展一个类,我想使用ES2015的rest / spread语法将参数传递给父类,就像this question

的答案一样
var text='{"value": "I said, \\"hello\\""}';

但我收到错误constructor(...args) { super(...args); } ,我的应用无法编译。

我做了a contrived example using the typescript playground。有没有人知道如何让它工作而不必显式写出父类方法的参数?

更新:正如Teddy Sterne所指出的,我实际上不需要将它用于构造函数,因为它具有相同的参数。我实际上想用这个方法返回一个observable。我想通过覆盖方法并返回super.parentMethod(... args).catch(/ *处理错误* /)来捕获错误

3 个答案:

答案 0 :(得分:1)

此问题在本期问题中得到了回答:https://github.com/Microsoft/TypeScript/issues/11679

你是正确的假设是因为类型检查。让我们假设父构造函数需要固定数量的参数。在声明super(...args)点时,编译器不知道传递的参数的实际数量。因此它将其标记为不安全。

答案 1 :(得分:0)

如果ChildParent的构造函数具有完全相同的参数,则无需指定构造函数。将注入父项所需的依赖项,并且将隐式调用父项的构造函数。

class ParentClass {
    constructor(dep1: Dep1, dep2: Dep2) { }
}

class ChildClass {

}

如果孩子有其他依赖关系,那么你必须重新指定它们,然后将它们传递给Child的构造函数中的Parent的构造函数。

class ParentClass {
    constructor(dep1: Dep1, dep2: Dep2) { }
}

class ChildClass {
    constructor(dep1: Dep1, dep2: Dep2, dep3: Dep3) {
        super(dep1, dep2);
    }
}

答案 2 :(得分:0)

另一种解决方法是使用内置的 ConstructorParameters 类型助手。

class A {
    constructor (foo: number, bar: string) {}
}


class B extends A {
    constructor (...args: ConstructorParameters<typeof A>) {
        super(...args);
    }
}