在typescript中为现有类添加方法?

时间:2017-03-24 12:39:36

标签: javascript typescript

我正在进行一个有角度的2 cli项目,我必须在其中创建一个插件的定义,因为它不存在它的类型。这个插件取决于已经自己输入的主库,它可以工作。

反正 我有两个文件 主要的

图书馆类型文件A

export class A extends B {
    constructor(...);
    methodX(): void;
}

我需要为我的插件添加一个新方法,所以我的课就像

export class A extends B {
        constructor(...);
        methodX(): void;
        methodY(): void;
    }

重点是我需要将其添加到单独的文件中。问题是在不创建新类的情况下向现有类添加方法

如果我把

PLUGIN TYPES FILE B

export class A extends B {
    constructor(...);
    methodX(): void;
}

PLUGIN TYPES FILE B

export class A extends B {
        constructor(...);
        methodX(): void;
        methodY(): void;
}

它不起作用,是否有人可以如何覆盖类或使用新方法扩展它?

由于

3 个答案:

答案 0 :(得分:4)

您可以通过使用新方法创建接口并修改原型来实现。

这样的事情:

class B { }

class A extends B {
    constructor() {
        super();
    }
    methodX(): void { };
    methodY(): void { };
}


interface B {
    newMethod(): void;
}

B.prototype.newMethod = function () { console.log('a') };

这允许您在进行时进行正确的输入。

new A().newMethod();

我制作了一个游乐场示例here

答案 1 :(得分:3)

您可以直接将其作为A.prototype.functionName = function(){...}

执行

这是一个掠夺者:http://plnkr.co/edit/6KrhTCLTHw9wjMTSI7NH?p=preview

答案 2 :(得分:3)

TypeScript文档中的“声明合并>模块增强”部分似乎提供了解决方案:

https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation

在您的情况下,如果从class A导出了file1.ts,并且您想将methodY()添加到另一个模块file2.ts中的该类中,请尝试以下操作:< / p>

//// file1.ts
export class A extends B {
    constructor(...);
    methodX(): void;
}

//// file2.ts
import { A } from "./file1";
declare module "./file1" {
    interface A {
        methodY(): void;
    }
}
A.prototype.methodY = function() {}