gpt4 book ai didi

typescript :不能在模块外使用导入语句

转载 作者:行者123 更新时间:2023-12-03 07:27:19 24 4
gpt4 key购买 nike

我在 node js(07.10.19 的 node.js 的最新版本)应用程序中有一个 .ts 文件,其中导入了 node-module 而没有默认导出。我使用这种结构:import { Class } from 'abc';当我运行代码时,我有这个错误:Cannot use import statement outside a module .

在网络中,我看到了很多解决这个问题的方法(对于 .js),但这对我没有帮助,可能是因为我有 typescript 文件。这是我的代码:

import { Class } from 'abc';
module.exports = { ...
execute(a : Class ,args : Array<string>){ ...

这是我的 tsconfig.json:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",

"strict": true
}
}

最佳答案

更新:因为这个答案获得了重要的意见,我已经更新了它,以更好地展示 2022 年这个问题的可用解决方案。

该错误表示 Node 找到了 import在文件中声明它不考虑 ECMAScript (ES) 模块。 Adding "type": "module" to package.json 会告诉 Node 你正在使用 ES 模块,但是你需要通过设置 "module": "es2015" 来告诉 TypeScript 编译器发出这种类型的模块。 "es2020" 中的或更高(例如:tsconfig.json) .如果你想发出 CommonJS 模块( require ),设置 "module": "commonjs" .
如果您不想在项目级别设置模块系统,还有更细粒度的选项。带有 .mjs 的文件扩展名总是被视为 ES 模块,而带有 .cjs 的文件总是被视为 CommonJS 模块。从 TypeScript 4.5 开始,可以使用 .mts.cts扩展名并让编译器发出 .mjs.cjs文件,分别。
这两个系统是部分兼容的。例如,可以使用默认导出将 CommonJS 模块导入 ES 模块:

// in an ES module
import thing from "./main.cjs";
另一种方式。一个 ES 模块可以通过动态导入导入到 CommonJS 模块中(需要 ES2020 特性才能工作):
// in a CommonJS module
const thing = await import("./main.mjs");

原始答案(2020):
添加 "type": "module"package.json会告诉 Node 你正在使用 ES2015 模块,这应该可以消除错误,但是你需要通过设置 "module": "es2015" 告诉 Typescript 生成这种类型的模块而不是 "commonjs"tsconfig.json .
然而,这会导致当前代码出现问题,因为尽管您使用的是 ES6 import {}您正在使用 commonJS module.exports = {} 导出的语句语法,并且 Node 的 ES 模块加载器会出现问题。有两种方法可以处理它:
  • 保留 module.exports,但告诉 Node 通过给它一个 .cjs 扩展名来将此文件解释为 commonJS。
  • 将导出语句更改为 ES2015 语法:export function execute(…)..

  • 第一个选项可能会有点棘手,因为编译器会输出 .js 文件,而您必须一直将其更改为 .cjs(据我所知)。使用第二个选项,您应该能够使用 Node 运行文件(包括版本 < 13.8 的 --experimental-modules 标志)。
    如果你绝对需要使用 commonJS,也许最好安装 Node 的类型定义: @types/node并将导入更改为 commonJS 格式: require('abc')并保持其余设置不变(尽管您可以将 "type": "commonjs" 添加到 package.json 以明确表示)。

    关于 typescript :不能在模块外使用导入语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58273824/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com