Closure编译器导出Typescript类和函数

时间:2015-04-29 12:49:29

标签: javascript typescript minify google-closure-compiler bundling-and-minification

我试图在typescript生成的类上使用闭包编译器高级模式但没有成功。有谁做过这样的事情。

Typescript Class

class TestData {
BlogName: string;
CacheTimeOut: number;
CopyrightHolder: string;

constructor(blogName: string, cacheTimeOut: number, copyrightHolder: string) {
    this.BlogName = blogName;
    this.CacheTimeOut = cacheTimeOut;
    this.CopyrightHolder = copyrightHolder;
}

addBlog(value: string): boolean {
    console.log('add blog');
    return true;
}

validate(): boolean {
    console.log('all valid');
    return true
}       
}

var myTestData = new TestData("name",22,"cpyright");

生成代码

var TestData = (function () {
function TestData(blogName, cacheTimeOut, copyrightHolder) {
    this.BlogName = blogName;
    this.CacheTimeOut = cacheTimeOut;
    this.CopyrightHolder = copyrightHolder;
}
TestData.prototype.addBlog = function (value) {
    console.log('add blog');
    return true;
};
TestData.prototype.validate = function () {
    console.log('all valid');
    return true;
};
return TestData;

})();var myTestData = new TestData();

这会编译成

new function() {};

我知道我应该提供出口,所以我添加了

window['TestData'] = TestData;
window['TestData'].prototype['addBlog'] = TestData.prototype.addBlog
window['TestData'].prototype['validate'] = TestData.prototype.validate

封闭编译器高级编译的输出是

var a = function() {
  function b() {
  }
  b.prototype.a = function() {
    console.log("add blog");
    return !0;
  };
  b.prototype.b = function() {
    console.log("all valid");
    return !0;
  };
  return b;
}();
window.TestData = a;
window.TestData.prototype.addBlog = a.prototype.a;
window.TestData.prototype.validate = a.prototype.b;
new a;

如果您发现仍然没有剩余的构造函数代码。当我们在模块中添加它时,情况会变得更糟。

我也尝试使用谷歌关闭的@export没有成功

Google recommendations

我看到几个插件可以根据typescript生成闭包编译器注释,但那些也没有生成正确的代码。

Thirdparty closure annotations generator

2 个答案:

答案 0 :(得分:1)

我对此进行了一次非常基本的测试。也许你改变了你的代码并且没有重新尝试过。

如果您在问题中编译TypeScript,则应该生成以下JavaScript:

var TestData = (function () {
    function TestData(blogName, cacheTimeOut, copyrightHolder) {
        this.BlogName = blogName;
        this.CacheTimeOut = cacheTimeOut;
        this.CopyrightHolder = copyrightHolder;
    }
    TestData.prototype.addBlog = function (value) {
        console.log('add blog');
        return true;
    };
    TestData.prototype.validate = function () {
        console.log('all valid');
        return true;
    };
    return TestData;
})();
var myTestData = new TestData("name", 22, "cpyright");

特别是,最后一行将参数传递给TestData构造函数。

快速运行会导致{white-space is mine)使用@compilation_level SIMPLE_OPTIMIZATIONS

var TestData=function(){
    function a(a,b,c){
        this.BlogName=a;this.CacheTimeOut=b;this.CopyrightHolder=c
    }
    a.prototype.addBlog=function(a){console.log("add blog");return!0};
    a.prototype.validate=function(){
        console.log("all valid");return!0
    };
    return a
}(),myTestData=new TestData("name",22,"cpyright");

如果对部分代码使用高级优化,则会过于激进。您需要为Closure编译器提供所有代码,以了解实际上没有使用的内容。

如果您的示例代表了您的所有代码,您会注意到构造函数以及所有三个属性(BlogName,CacheTimeOut和CopyrightHolder)都是真正永远不会使用的,因此可以在不影响程序行为的情况下将其删除

答案 1 :(得分:1)

答案:优化的noops是 - 等待它 - noops :)。

说明:

如果您在此使用您的代码http://www.closure-compiler.appspot.com/home 使用ADVANCED_OPTIMIZATIONS,它会产生:

new function(){};

如果你添加myTestData.addBlog("test");,它会产生:

(new (function(){function a(){}a.prototype.a=function(){console.log("add blog")};return a}())).a();