导入具有条件导出的本地模块

时间:2014-06-18 20:21:48

标签: typescript

我有一个模块“foo”,我试图导入3个不同的文件(使用AMD)。这是我的文件夹结构:

lib/
    foo.ts
views/
    view1/
        view1.ts
    view2/
        view2.ts
        sub/
            subview2.ts

我希望能够将foo.ts设置为None / AMD / CommonJS。如果我把“export = foo;”在文件中它不会编译正常使用。我希望能够如下所示进行设置:

module foo {
    declare var define: any;
    declare var module: any;

    if (typeof define === 'function' && define.amd) {
        define(() => {
            return foo;
        });
    } else if (typeof module !== 'undefined' && module.exports) {
        module.exports = foo;
    }
}

declare module 'foo' {
    export = foo;
}

以上适用于节点模块(由于某些节点魔术),但它不适用于本地文件。从文件夹结构我需要以下两个语句才能工作。

import foo = require('../../lib/foo');

import foo = require('../../../lib/foo');

TypeScript不喜欢我做其中任何一个,除非我使用以下内容,否则会抱怨:

import foo = require('foo');

然而,这在运行时不起作用(除非foo是打包的节点模块,否则它不是)。我知道我可以进入foo.ts文件并输入“export = foo;”在根级别,但我没有写foo,宁愿不编辑我没写的东西,以便我将来可以轻松更新它。

这有什么好方法,或者我错过了什么?

1 个答案:

答案 0 :(得分:0)

如果您正在使用某人的JS文件

  

具有条件导出的本地模块

这是一个实现细节,属于 JavaScript ,不属于TypeScript typedefinition(d.ts)。您的foo.d.ts应如下所示:

module foo {
    export var SomePropertyFromFoo:string;
}

declare module 'foo' {
    export = foo;
}
  

以上适用于节点模块(由于某些节点魔术),但它不适用于本地文件。

你也可以在这里让节点魔术为你服务。将相应的foo.js文件放在<{1>}文件夹上面文件中,node_modules将在运行时中使用。现在让我们修复编译时间:

  

TypeScript不喜欢我做其中任何一个,除非我使用以下

,否则会抱怨

然后你可以参考+导入(注意:两者都是必需的):

require('foo')

这正是你应该为外部模块做的事情。

如果您拥有TS文件

  

您希望.ts文件既可以使用模块加载,也可以不使用

目前没有受支持的方式来执行此操作。这是目前的“或”主张(内部与外部)。 TypeScript API本身就存在这个问题(它是一个基于内部模块的系统,需要将hack导出到commonjs Get TypeScript class in a file and read single parts of it)。