【问题标题】:Importing a local module that has conditional export导入具有条件导出的本地模块
【发布时间】:2014-06-18 20:21:47
【问题描述】:

我有一个模块“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,并且宁愿不编辑我没有写的东西,以便我将来可以轻松更新它。

有什么好的方法可以解决这个问题,还是我错过了什么?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    如果你使用的是别人的 JS 文件

    具有条件导出的本地模块

    这是一个实现细节,属于 JavaScript 而不是 TypeScript 类型定义 (d.ts)。你的foo.d.ts 应该是这样的:

    module foo {
        export var SomePropertyFromFoo:string;
    }
    
    declare module 'foo' {
        export = foo;
    }
    

    以上适用于节点模块(因为一些节点魔法),但不适用于本地文件。

    您也可以在这里让节点魔法为您工作。将相应的foo.js 文件放在您的文件上方node_modules 文件夹中,require('foo') 将在运行时工作。现在让我们修复编译时间:

    TypeScript 不喜欢我这样做,除非我使用以下内容,否则会抱怨

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

    /// <reference path='../foo.d.ts'/>
    import foo = require('foo');
    

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

    如果您拥有 TS 文件

    您希望 .ts 文件在加载和不加载模块时都可以工作

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

    【讨论】:

    • 在我的场景中,我实际上有 .ts(不是 .d.ts 和 .js)。我正在寻找一种构建 .ts 的方法,以便我可以将它与/不加载模块一起使用。假设您有一个用 TypeScript 编写的库,并且您想要分发 .ts 文件而不是分发 .d.ts 和 .js 文件。您希望 .ts 文件在模块加载和不加载的情况下都可以使用。有什么简单的方法可以做到这一点,还是你必须做一些奇怪的事情?
    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2016-07-21
    • 2016-05-11
    • 1970-01-01
    • 2023-04-05
    • 2021-11-06
    相关资源
    最近更新 更多