我怎样才能使用Javascript"部分类"使用TypeScript样式类定义

时间:2015-10-27 21:41:39

标签: javascript class typescript partial-classes

我的应用程序有一个api包装类,最初是通过在TypeScript中输入并将javascript复制/粘贴到我的应用程序中创建的。

所以类def看起来像这样:

var SiteApi = (function () {
  function SiteApi(initially) 
  {
    //stuff
  }

  SiteApi.prototype.method1 = function(){/*stuff*/};
  SiteApi.prototype.method2 = function(){/*stuff*/};

  return SiteApi;
})();

现在当他们在管理页面上时,我想添加一个包含管理员方法的额外admin.js文件。例如

SiteApi.prototype.Admin.method1 = function(){/*stuff*/};

我找到了一个例子来做"最终结果"我想要的:

// file main
function SomeObject() {
    for (var i = 0, ii = SomeObject.Partial.length; i < ii; i++) {
         SomeObject.Partial[i].apply(this, arguments);
    }
}

SomeObject.Partial.SomeName = function() {
   ...
}

// file extra
SomeObject.Partial.SomeOtherName = function() {
   ...
}

(来自:Is it possible to give javascript partial class behavior like C# or monkey patching like Ruby does?

但是,他们使用的类定义类型不同。

如何保留TypeScript样式类定义,并执行类似于此示例的操作以添加管理功能?

作为参考,我们使用我们的类:

siteApi = new SiteApi();

所以我想也需要有一行代码将管理功能绑定到它中。

注意,我可以使用类似SiteApi.admin_method1之类的东西,但问题是使用TypeScript样式类,原型在定义中定义并且对象被执行,所以它看起来并不像直截了当如何在以后添加更多原型。

1 个答案:

答案 0 :(得分:4)

选项1

延长SiteApi但隐藏原件,例如你的 admin.js 加载后会包含类似

的内容
SiteApi = (function (old_SiteApi) {
    function SiteApi() {
        old_SiteApi.apply(this, arguments);
        // further construction
        this.admin_method1 = function () {/* some admin instance method */};
    }
    SiteApi.prototype = Object.create(old_SiteApi.prototype);
    // add more prototype things
    SiteApi.prototype.admin_method2 = function () {/* admin stuff through prototype */},
    return SiteApi;
}(SiteApi));

选项2

SiteApi知道以后需要更多内容,例如原定义将成为

var SiteApi = (function () {
    function SiteApi(initially) {
        //stuff
        var i;
        for (i = 0; i < SiteApi.Extras.length; ++i) {
            SiteApi.Extras[i].apply(this);
        }
    }
    SiteApi.Extras = [];

    SiteApi.prototype.method1 = function () {/* stuff */};
    SiteApi.prototype.method2 = function () {/* stuff */};

    return SiteApi;
}());

然后 admin.js 会做

SiteApi.Extras.push(
    function () {
        // stuff to make `this` into an Admin object
        this.admin_method1 = function () {/* some admin instance method */};
    }
);

选项3

SiteApi原型仍然暴露,如果您不需要做更多的构建,只需要新的方法,您只需将它们添加到 admin.js < / em>的

Object.assign(SiteApi.prototype, {
    admin_method1: function () {/* admin stuff through prototype */},
    admin_method2: function () {/* more admin stuff through prototype */}
});

最后一个选项是影响 admin.js 加载之前创建的 SiteApi 实例的唯一选项。

当然,您也可以将选项2和3混合在一起。类似地,您可以使用选项1但是将新构造函数调用为不同的名称而不是隐藏原始构造函数,例如 AdminApi ,并在管理页面上使用它而不是 SiteApi