代码之家  ›  专栏  ›  技术社区  ›  Dietrich Epp

如何使TypeScript将文件视为一个模块?

  •  0
  • Dietrich Epp  · 技术社区  · 5 年前

    从…起 https://www.typescriptlang.org/docs/handbook/modules.html

    在TypeScript中,就像在ECMAScript 2015中一样,任何包含顶级 import export 声明被视为一个脚本,其内容在全局范围内可用(因此也适用于模块)。

    这种行为是令人惊讶和不想要的,我如何防止它?

    lib.ts ,

    var myglobal = 3;
    console.log(`lib.ts: myglobal = ${myglobal}`);
    

    然后考虑 main.ts ,导入的文件 关于其副作用:

    import './lib.js';
    console.log(`main.ts: myglobal = ${myglobal}`);
    

    为了完整性,我提供了一个 tsconfig.json :

    {
      "compilerOptions": {
        "lib": ["ES2015", "DOM"],
        "module": "ES2015",
        "strict": true
      },
      "files": ["main.ts", "lib.ts"]
    }
    

    应该 未能编译,但tsc成功了,这让我很沮丧。然后将结果与汇总捆绑在一起。js,

    export default {
      input: "main.js",
      output: {
        file: "bundle.js",
        format: "module",
      },
    };
    

    myglobal 在里面 自由党。ts 主要的ts ,因为Rollup注意到 myglobal main 并得出结论,应在 lib

    var myglobal$1 = 3;
    console.log("lib.ts: myglobal = " + myglobal$1);
    
    console.log("main.ts: myglobal = " + myglobal);
    

    当我运行它时,它失败了。

    $ node bundle.js 
    lib.ts: myglobal = 3
    /redacted/bundle.js:4
    console.log("main.ts: myglobal = " + myglobal);
                                         ^
    
    ReferenceError: myglobal is not defined
        at Object. (/redacted/bundle.js:4:38)
        at Module._compile (internal/modules/cjs/loader.js:1063:30)
        at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
        at Module.load (internal/modules/cjs/loader.js:928:32)
        at Function.Module._load (internal/modules/cjs/loader.js:769:14)
        at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
        at internal/main/run_main_module.js:17:47
    

    lib.js 作为一个模块,如我所愿?

    (在搜索ES2015规范时,我找不到任何支持“任何包含顶级 进口 出口

    0 回复  |  直到 5 年前
        1
  •  0
  •   Ryan Cavanaugh    5 年前

    文件是否是模块取决于加载它的上下文,TS无法知道,因此需要基于文件内容的一些线索。因为没有导入或导出的文件 任何东西 非常罕见,, import export 声明用于推断文件是否为模块。

    export { } 创建一个文件,使其成为一个模块。

    推荐文章