首页 > 解决方案 > 打字稿:不能在模块外使用导入语句

问题描述

我在 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
  }
}

标签: typescriptecmascript-6

解决方案


添加"type": "module"到 package.json将告诉 Node 你正在使用 ES2015 模块,这应该可以消除错误,但是你需要通过设置"module": "es2015"而不是tsconfig.json 来告诉 Typescript 生成这种类型的模块"commonjs"

然而,这会导致当前代码出现问题,因为尽管您使用的是 ES6import {}语句,但您正在使用 commonJSmodule.exports = {}语法导出,并且 Node 的 ES 模块加载器会出现问题。有两种方法可以处理它:

  1. 保留.cjs 扩展名module.exports,告诉 Node 将此文件解释为 commonJS 。
  2. 将导出语句更改为 ES2015 语法:export function execute(…)..

第一个选项可能会有点棘手,因为编译器将输出 .js 文件,并且您必须始终将其更改为 .cjs (据我所知)。使用第二个选项,您应该能够使用 Node 运行文件(包括版本 < 13.8 的 --experimental-modules 标志)。

如果您绝对需要使用 commonJS,也许最好安装 Node 的类型定义:@types/node并将导入更改为 commonJS 格式:require('abc')并保持其余设置不变(尽管您可以添加“type” : “commonjs” 到 package.json 是明确的)。


推荐阅读