Typescript:无法在模块外部使用 import 语句

2023-12-08

我在 Node js(2019 年 10 月 7 日最新版本的 Node.js)应用程序中有一个 .ts 文件,可以导入节点模块而无需默认导出。我使用这个结构: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
  }
}

更新:因为这个答案得到了重要的关注,所以我对其进行了更新,以更好地展示 2022 年该问题的可用解决方案。


该错误意味着 Node 发现了一个import在文件中声明它不考虑 ECMAScript (ES) 模块。Adding "type": "module" to package.json会告诉 Node 你正在使用 ES 模块,但是你需要通过设置告诉 TypeScript 编译器发出这种类型的模块"module": "es2015"或更高(例如:"es2020") in tsconfig.json。如果你想发出 CommonJS 模块(require), set "module": "commonjs".

如果您不想在项目级别设置模块系统,还有更细粒度的选项。文件与.mjs扩展名始终被视为 ES 模块,而带有.cjs始终被视为 CommonJS 模块。从 TypeScript 4.5 开始,可以使用.mts and .cts扩展以及让编译器发出.mjs or .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):

Adding "type": "module" to package.json会告诉 Node 你正在使用 ES2015 模块,这应该会消除错误,但是你需要告诉 Typescript 通过设置来生成这种类型的模块"module": "es2015"代替"commonjs" in tsconfig.json.

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

  • 保留 module.exports,但通过给它一个 .cjs 扩展名来告诉 Node 将此文件解释为 commonJS。
  • 将导出语句更改为ES2015语法:export function execute(…)..

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript:无法在模块外部使用 import 语句 的相关文章

随机推荐

  • 宏重载

    是否可以定义这样的东西 define FOO x y BAR define FOO x sth y BAR sth 这样 FOO daf sfdas FOO fdsfs something 5 翻译成这样 BAR BAR something
  • UITableViewController 中的状态栏

    我用一个UITableViewController into a Navigation Controller当出现UIButton按下 当按钮被按下时TableViewController出现时没有状态栏 如果我选择一个单元格TableVi
  • FRestore文档onUpdate:仅针对特定字段触发

    在我的云功能中 我有下一个功能 export const collectionOnUpdate functions firestore document cards id onUpdate async change context gt a
  • Node.js + Socket.io |在服务器上设置自定义标头

    我使用 Helmet 和 Express 从服务器端设置相当多的安全 HTTP 标头 当在 Node js 应用程序顶部渲染客户端页面时 使用以下命令 这做得很好 var app express app use helmet res ren
  • 在另一个 IQueryable 中使用 IQueryable

    我有一个扩展方法 它返回一个 IQueryable 来获取公司产品 我只想在 IQueryable 中使用它作为子查询 public static class DBEntitiesCompanyExtensions public stati
  • 通过 JSF 将 PDF 发送到浏览器

    我正在尝试将 JasperReports 生成的 PDF 文件发送到用户的浏览器 我找不到托管 bean 方法中的问题 以下是一个片段 System out println Making pdf FacesContext fc FacesC
  • Windows Phone 8 上的 HttpWebRequest 同步

    为了设计 重用可用于 WPF 应用程序 Windows Phone 8 应用程序和更高版本的 Windows 8 RT 应用程序的库 我们需要进行一些 HttpWebRequest 调用 最好是同步调用 以免破坏现有应用程序 问题是已经存在
  • 使用 AJAX 和 JQuery 通过 PHP 进行简单验证

    我是新来的AJAX 我想学习如何验证表单 假设我有一个带有两个输入字段的表单 当我点击提交时 我想用 php 脚本检查页面 验证成功后我想重定向到action submitForm php 当一个或多个字段根据validation php我
  • OpenVINO:如何使用推理引擎构建 OpenCV 以支持从模型优化器加载模型

    我安装了 OpenVINO 并想在 Windows 10 上运行以下代码 import numpy as np import cv2 import sys from get face id import face id getter fro
  • 如何在 Oracle 11gr2 中安装 Procedural Option

    我一直在尝试在计算机上本地安装的 Oracle 11gR2 上创建 PL SQL 包并运行过程 但一直收到 ORA 00900 错误 基于此article 看来Procedural Option还没有安装 这是我登录时 sqlplus 的输
  • 事件驱动编程如何帮助仅执行 IO 的 Web 服务器?

    我正在考虑为我们的新后端项目使用一些框架 编程方法 它涉及 BackendForFrontend 实现 聚合下游服务 为简单起见 以下是它所经历的步骤 请求进入网络服务器 Web服务器发出下游请求 下游请求返回结果 Web服务器返回请求 事
  • CodeIgniter 2.0 - 验证数组

    我在将一段表单验证代码转换为 CI 2 0 时遇到一些问题 我正在尝试验证一组复选框 但由于某种原因验证无法运行回调或不验证 如何验证一组复选框 以便至少选中一个并且值必须是选项之一 选项数组的键 EDIT 这是对我失败的地方的更好解释 可
  • 使用 na.approx 在数据框中插入 NA 值

    我正在尝试删除NA通过插值从我的数据框中获取na approx 但无法删除所有NAs 我的数据帧是 4096x4096 其中 270 15 作为无效值的标志 我需要在所有点上连续的数据来提供气象模型 昨天我询问并获得了关于如何基于另一个数据
  • 循环创建PyQt5按钮:所有按钮触发相同的回调

    我应该提到 我已经阅读了这些内容 但我仍然无法实现我的目标 在 for 循环中使用字典来创建按钮不起作用 循环中的 QtCore QObject connect 仅影响最后一个实例 我的目标是制作一个 Linux 启动器 应用程序 按钮的创
  • session_start() 错误

    我无法处理这个错误 请帮助我 它可以在我的笔记本电脑上运行 但不能在我的台式机上运行 Why Warning session start function session start Cannot send session cache li
  • 如何让代码在Response.end之后执行

    我的代码是这样的 HttpContext Current Response Clear HttpContext Current Response ContentType application pdf HttpContext Current
  • 使用 LocationClient 获取位置更新

    我该如何使用locationclient类与requestLocationUpdates LocationRequest LocationListener 在android中获取位置更新 我已经尝试过以下代码 但它不起作用 谁能帮我这个 哪
  • 在Sql Server中编写TRANSFORM语句

    我正在将 Web 应用程序后端从 Access 迁移到 MSSQL 但是我无法在 MSSQL 中重现以下查询 有什么想法吗 TRANSFORM First FollowUp FUData AS FirstOfFUData SELECT Fo
  • 使用 WCF 服务返回 List

    我得到了一个Employee班级和每个员工都有一份请假清单 可以给个清单吗AppliedLeave as a DataMember in WCF DataContract public class Employee DataMember p
  • Typescript:无法在模块外部使用 import 语句

    我在 Node js 2019 年 10 月 7 日最新版本的 Node js 应用程序中有一个 ts 文件 可以导入节点模块而无需默认导出 我使用这个结构 import Class from abc 当我运行代码时 出现以下错误 Cann