如何让 TypeScript 将我的文件视为模块?

问题描述 投票:0回答:3

来自 https://www.typescriptlang.org/docs/handbook/modules.html

在 TypeScript 中,就像在 ECMAScript 2015 中一样,任何包含顶级

import
export
的文件都被视为模块。相反,没有任何顶级
import
export
声明的文件将被视为其内容在全局范围内可用的脚本(因此也适用于模块)。

这种行为令人惊讶且不受欢迎,我该如何防止它?

考虑一个为其副作用而编写的 TypeScript 模块,

lib.ts

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

然后考虑

main.ts
,一个导入
lib.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 成功了,这让我很沮丧。然后我将结果与 rollup.js 捆绑在一起,

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

结果输出显示,Rollup 和 TypeScript 对于

myglobal
中的
lib.ts
是否从
main.ts
中可见存在明显分歧,因为 Rollup 注意到
myglobal
main
中的自由变量,并得出结论认为应该将其重命名为
lib

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

console.log("main.ts: myglobal = " + myglobal);

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

$ 节点bundle.js
lib.ts: myglobal = 3
/redacted/bundle.js:4
console.log("main.ts: myglobal = " + myglobal);
                                     ^

ReferenceError:myglobal 未定义
    在对象。 (/redacted/bundle.js:4:38)
    在 Module._compile (内部/modules/cjs/loader.js:1063:30)
    在 Object.Module._extensions..js (内部/模块/cjs/loader.js:1092:10)
    在 Module.load (内部/modules/cjs/loader.js:928:32)
    在 Function.Module._load (内部/modules/cjs/loader.js:769:14)
    在 Function.executeUserEntryPoint [作为 runMain] (内部/模块/run_main.js:72:12)
    在内部/main/run_main_module.js:17:47

TypeScript 中原本应该是编译时错误的内容现在变成了运行时错误。如何配置 TypeScript 以按照我的意图将

lib.js
视为模块?

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

import
export
的文件都被视为模块”的说法。事实上,似乎一个文件是否是一个模块)模块在解析开始之前就已确定,因为它会影响 JavaScript 解析器的目标符号。那么,TypeScript 文档的这一部分有意义吗?)

typescript es6-modules
3个回答
1
投票

文件是否是模块取决于加载它的上下文,哪个 TS 无法知道,因此需要根据文件内容提供一些线索。由于不导入或导出 anything 的文件非常罕见,因此使用

import
export
声明来推断文件是否是模块。

您可以将

export { }
添加到文件中以使其成为模块。


0
投票

尝试使用“--isolatedModules”进行编译将立即在 Typescript 不认为是模块的任何文件上出错。它还限制了某些打字稿功能的使用。


0
投票

空文件

虽然不是您的情况,但对于其他查看者来说,我在创建新的

.ts
文件后遇到了同样的问题。事实证明,“空文件不是一个被考虑的模块”。您可以简单地填充它,然后导出一些东西以使其成为一个模块。

© www.soinside.com 2019 - 2024. All rights reserved.