【发布时间】:2015-07-08 18:27:53
【问题描述】:
我正在尝试在 typescript 生成的类上使用闭包编译器高级模式,但没有成功。有没有人做过这样的事情。
打字稿类
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,但没有成功
我看到几个插件可以生成基于 typescript 的闭包编译器注释,但它们也不会生成正确的代码。
【问题讨论】:
-
闭包编译器移除死代码。您可以使用 goog.provide 导出此类并使用 goog.require 来使用它。但是如果你不在任何代码中使用它,它就不会显示在编译的代码中
-
所以应该手动给生成的代码..?
-
我试过 goog.provide('TestData');还是不行
-
@anandaravindan 它在高级模式下被删除,因为您从不使用这些属性。如果这是“你所有的代码”,那么它正在正确地优化它——因为你永远不需要这些值。如果这是“您的一些代码”,您需要更加保守,并使用简单的优化来避免丢失可能在其他地方使用的内容。
-
@史蒂夫芬顿。明白了。我在方法博客中使用了这些变量并且它起作用了。谢谢。
标签: javascript typescript minify google-closure-compiler bundling-and-minification