typescript - 打字稿:不能在模块外使用导入语句
问题描述
我在 node js(07.10.19 的 node.js 的最新版本)应用程序中有一个 .ts 文件,其中导入了 node-module 而没有默认导出。我使用这种结构:import { Class } from 'abc';
当我运行代码时,我有这个错误:Cannot use import statement outside a module
。
在网络中,我看到了很多解决这个问题的方法(对于 .js),但这对我没有帮助,可能是因为我有打字稿文件。这是我的代码:
import { Class } from 'abc';
module.exports = { ...
execute(a : Class ,args : Array<string>){ ...
这是我的 tsconfig.json:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"strict": true
}
}
解决方案
添加"type": "module"
到 package.json将告诉 Node 你正在使用 ES2015 模块,这应该可以消除错误,但是你需要通过设置"module": "es2015"
而不是tsconfig.json 来告诉 Typescript 生成这种类型的模块"commonjs"
。
然而,这会导致当前代码出现问题,因为尽管您使用的是 ES6import {}
语句,但您正在使用 commonJSmodule.exports = {}
语法导出,并且 Node 的 ES 模块加载器会出现问题。有两种方法可以处理它:
- 保留.cjs 扩展名
module.exports
,告诉 Node 将此文件解释为 commonJS 。 - 将导出语句更改为 ES2015 语法:
export function execute(…)..
第一个选项可能会有点棘手,因为编译器将输出 .js 文件,并且您必须始终将其更改为 .cjs (据我所知)。使用第二个选项,您应该能够使用 Node 运行文件(包括版本 < 13.8 的 --experimental-modules 标志)。
如果您绝对需要使用 commonJS,也许最好安装 Node 的类型定义:@types/node并将导入更改为 commonJS 格式:require('abc')
并保持其余设置不变(尽管您可以添加“type” : “commonjs” 到 package.json 是明确的)。
推荐阅读
- python - Python - 显示消息是输入了错误的命令(Discord.py)
- django - 如何覆盖通过 API 发送 post 请求时将响应的 CharField max_length 验证错误消息?
- automated-tests - 何时在 Appium 中使用 wait.until?
- javascript - 错误:无法读取未定义的属性“过滤器”,无法获取道具
- javascript - 使用函数和简单方法的数组中最短的单词是什么?
- sql - 如何安全地将 SQL 数组元素取消嵌套到列?
- css - mat-autocomplete Angular-7 中的 CSS 问题
- typescript - 转到定义在 VS Code 版本 1.47.2 中不起作用
- blazor - 如何在 Blazor Wasm 加载时显示从 api 获取的报价(即在加载屏幕上)?
- mysql - 我可以使用 MariaDb 的自动数据版本控制进行更改数据捕获吗