导出混合类型和模块

Exporting hybrid type and module

几个月来,我一直在 TypeScript 中愉快地使用 classes 和 CommonJS 外部模块中的 "attached" 模块进行开发,如下所示:

exports = JQ;

class JQ {
    a = 0;
}

module JQ {
    export class HelpClass {}
    export interface Something {}
}

我喜欢这种模式,因为它使模块包含在文件中,减少了导入的数量,并且仍然公开了一个很好的 API。

现在,我不想导出 class,而是导出一个混合类型,这样它就可以用作具有其他功能和 classes "inside" 的函数,比如例如 jQuery、Underscore 和许多其他库。

我知道如何在 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 是 class 而不是混合类型时生成的代码完全一样)但编译器给出重复标识符错误,智能感知停止工作。

如果我删除额外的 class SomethingElse,它会正常工作,所以我想这是导出混合类型的特殊情况。

我也在 TypeScript Playground 上测试了它并得到了相同的结果:尽管 class JQvar JQ 都在 JS 中发出 var JQ,当它是 class TypeScript 允许并接受它,否则不接受。

我正在尝试做的事情不受支持吗?但是,由于发出的 JS 是有效的,所以它是编译器中已有的功能,是否应该将此作为错误报告给 TypeScript 开发人员?

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