几个月来,我一直在TypeScript中愉快地使用CommonJS外部模块中带有“附加”模块的类进行开发,如下所示:
exports = JQ;
class JQ {
a = 0;
}
module JQ {
export class HelpClass {}
export interface Something {}
}我喜欢这种模式,因为它使模块包含在文件中,减少了导入的数量,并且仍然公开了一个很好的API。
现在,我不想导出一个类,而是导出一个混合类型,这样它就可以作为一个“内部”具有其他函数和类的函数使用,比如jQuery、下划线和许多其他库。
我知道如何在TypeScript中声明和创建混合类型,但是不能通过附加模块导出它。我确实获得了发出的JS代码的权限,但是编译器会抱怨。
例如,这是:
export = JQ;
var JQ = <JQ.JQStatic>function (a:string) { return a; };
JQ.method = function() { return 1; };
module JQ {
export interface JQStatic {
(a:string):string;
method() :number;
}
// Additional class here
export class SomethingElse {}
}生成类似于正确的JS代码(与如果JQ是类而不是混合类型时生成的代码完全相同),但编译器提供重复的标识符错误,并且intellisense停止工作。
如果删除额外的类SomethingElse,它将正确工作,因此我认为这是导出混合类型的特例。
我还在TypeScript游乐场上测试了它,得到了相同的结果:尽管class JQ和var JQ都在JS中发布了一个var JQ,但是当它是一个类时,TypeScript允许并接受它,否则就不会。
我想做的事没有人支持吗?但是,由于发出的JS是有效的,所以它是编译器中的一个特性,是否应该将其报告为TypeScript devs的一个bug?
发布于 2015-08-08 10:58:16
function JQ(a: string) { return a; }
module JQ {
export class SomethingElse { }
export function method() { return 1; }
}
export = JQ;请参阅https://github.com/Microsoft/TypeScript/wiki/Declaration-Merging
https://stackoverflow.com/questions/31889836
复制相似问题