在TypeScript中扩展Error类时未应用接口

时间:2018-04-22 14:04:31

标签: javascript typescript

我有一个Exception1类,它扩展了Error类的JavaScript,同时还实现了一个接口SampleInterface

interface SampleInterface {
    func(): string;
}

class SampleClass {
    public message: string;

    constructor(message: string) {
        this.message = message;
    }
}

class Exception1 extends Error implements SampleInterface  {
    constructor(message: string) {
        super(message);
    }

    public func(): string {
        return "Exception1"
    }
}

在控制台中执行console.log(new Exception1('a').func())时出现此错误

Uncaught TypeError: (intermediate value).func is not a function
    at <anonymous>:1:33

但是,如果类扩展了一些其他类,例如

,则可以正常工作
class Exception2 extends SampleClass implements SampleInterface  {
    constructor(message: string) {
        super(message);
    }

    public func(): string {
        return "Exception2"
    }
}

在执行console.log(new Exception2('a').func())时,我得到预期的输出Exception2

1 个答案:

答案 0 :(得分:1)

当您扩展内置类型(如ArrayErrorMap)时,原型链有点混乱,您需要明确修复,以便成员在您的班级中定义的班级可用于您班级的实例。这在TypeScript docu

中有所指出

因此,为了解决这个问题,您需要执行以下操作:

interface SampleInterface {
    func(): string;
}

class Exception1 extends Error implements SampleInterface  {
    constructor(message: string) {
        super(message);

        // Explicitly fix the prototype chain
        Object.setPrototypeOf(this, Exception1.prototype);
    }

    public func(): string {
        return "Exception1"
    }
}

console.log(new Exception1('a').func()) // and now it works