【问题标题】:TypeScript Class exported as a UMD module with strict modeTypeScript 类导出为具有严格模式的 UMD 模块
【发布时间】:2016-01-12 12:22:32
【问题描述】:

有没有办法可以将 TypeScript 类导出为启用严格模式的 UMD 模块? “gotcha”是严格模式部分。

我的代码如下所示:

class Foo {
    bar(): Foo.Bam {}
}

namespace Foo {
    export function boom() {}
    export interface Bam {}
}

export = Foo;

该模块可以在其他地方使用,例如:

import * as Foo from 'my-module';

var foo = new Foo();
foo.bar()

Foo.boom();

interface Kaboom extends Foo.Bam {}

我希望将严格模式应用于所有 Foo,但不是应用于整个脚本,因为它可能与其他未知脚本连接。

定义文件也在生成中。

我可以在构建过程中将所有内容都包装在一个闭包中,但我首先要寻找一个预编译解决方案。

编辑:

为我的问题添加了更多细节,以防万一将来有人找到方法。

我最终只是添加了一个简单的编译后修复。 UMD模块生成后。我替换了这一行:

})(["require", "exports"], function (require, exports) {

用这一行:

})(["require", "exports"], function (require, exports) {"use strict";

现在模块内的一切都是严格的,脚本本身不是。

【问题讨论】:

标签: typescript strict umd


【解决方案1】:

这是一个固定的问题。见Change prologue emit location to inside module IIFEs

【讨论】:

    【解决方案2】:

    如果您以标准方式使用您的模块(即根据需要加载它们),您可以将其添加到文件的顶部 - 语句将限定在文件的范围内。

    "use strict"
    
    class Foo {
        bar() {}
    }
    
    namespace Foo {
        export function bar() {}
    }
    
    export = Foo;
    

    如果您实际上是将输出组合到单个文件中,则不能在不引入命名空间的情况下限制语句的范围(另外:我不喜欢内部模块/命名空间)。

    namespace Example {
        "use strict"
    
        export class Foo {
            bar() {}
        }
    }
    
    namespace Foo {
        export function bar() {}
    }
    
    export = Example.Foo;
    

    【讨论】:

    • 懒加载没有问题。但是,当该模块与其他模块捆绑在一起以供生产使用(requirejs)时,我不希望严格模式只是挂在那里。该模块将公开可用,所以我只是想覆盖我的基础。在我尝试生成定义文件之前,您添加另一个命名空间的第二个选项有效;错误 TS4082。我最终只是实现了构建脚本修复,但我会用细节更新我的问题。谢谢:)
    猜你喜欢
    • 2015-11-07
    • 1970-01-01
    • 2019-07-08
    • 2018-09-06
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多