导出混合类型和模块

时间:2015-08-08 05:03:22

标签: typescript commonjs

我很高兴在TypeScript中使用带有#34;附加"的类开发了好几个月。 CommonJS外部模块中的模块如下:

exports = JQ;

class JQ {
    a = 0;
}

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

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

现在,我没有导出一个类,而是想导出一个混合类型,以便它可以用作具有其他函数和类的函数" 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是类而不是混合类型时生成的代码完全相同)但编译器会出现重复的标识符错误,并且intellisense停止工作。

如果删除其他类SomethingElse,它就能正常工作,所以我认为导出混合类型是一种特殊情况。

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

我试图做的是不受支持的吗?但是,由于发出的JS是有效的,所以它是编译器中已经存在的一个特性,是否应该将其报告为TypeScript开发人员的错误?

1 个答案:

答案 0 :(得分:0)

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