将插件注册到库

时间:2016-12-19 12:40:32

标签: javascript typescript

我有5个班级:

  • GConfig
  • GForest
  • GTree
  • GNode
  • 插件

我将导出为npm模块(用TS编写)。

我想要实现的是GConfig将有一个方法addPlugin(plugin: Plugin),它将参数作为自定义插件类的一个实例。
插件类看起来像:

enter image description here

目标是能够添加多个插件,其中每个插件都能够扩展核心库的相应GForest,GTree和GNode(添加到原型)并将这些扩充类返回给库消费者(客户端)。
应该存在添加多个插件的可能性,添加它们的顺序不重要。 (插件提供撤消和高级查询等功能)。

您认为这种方法是否可行,使用Typescript实现这一目标的常用方法是什么?

编辑:我本能地觉得这是mixins的一个用例,但我不确定在TS中动态添加这些mixins的设置。

1 个答案:

答案 0 :(得分:1)

是的,它可行,但可能不适合mixins,因为那时你需要提前知道你想要的成员/方法。

您可以这样做:

// myplugin.ts
import * from "mylib";

declare module "mylib" {
    interface GNode {
        myNewMethod(): void;
    }
}

class MyPlugin extends mylib.Plugin {
    plugNode(cls: { new(): myLib.GNode }) {
        cls.prototype.myNewMethod = function() {
            console.log("hey, I'm the new method");
        }
    }
}

mylib.GConfig.addPlugin(new MyPlugin());

请注意,这是未经测试的代码,如果您尝试,可能会包含一些错误。