打字稿:无法在模块外使用import语句

时间:2019-10-07 16:43:06

标签: typescript ecmascript-6

我在node js(07.10.19的最新版本的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
  }
}

5 个答案:

答案 0 :(得分:12)

Adding "type": "module" to package.json会告诉Node您正在使用ES2015模块,这应该摆脱错误,但是随后您需要通过设置func getUser(id: String) -> AppUser? { let db = Firestore.firestore() let userRef = db.collection("users").document(id) userRef.getDocument { (document, error) in if let document = document, document.exists { let userID = document.data()?["id"] as! String let userDisplayName = document.data()?["displayName"] as! String let userPhotoURL = document.data()?["photoURL"] as! String let userPoints = document.data()?["points"] as! Int? let userKnownLanguageCodes = document.data()?["knownLanguageCode"] as! Set<String>? let user = AppUser(id: userID, displayName: userDisplayName, photoURL: userPhotoURL, points: userPoints, knownLanguageCodes: userKnownLanguageCodes) return user } else { print("Error getting user") return nil } } } 而不是{{来告诉Typescript生成这种类型的模块。 1}}。

但这会导致当前代码出现问题,因为尽管您使用的是ES6 "module": "es2015"语句,但您使用的是commonJS "commonjs"语法进行导出,而Node的ES模块加载器也会遇到问题。有两种处理方法:

  1. 保留import {},但告诉Node用giving it a .cjs extension将此文件解释为commonJS。
  2. 将export语句更改为ES2015语法:module.exports = {}

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

如果您绝对需要使用commonJS,也许最好为Node:@types/node安装类型定义,然后将导入更改为commonJS格式:module.exports,并保留其余设置。是(尽管您可以在package.json中添加“ type”:“ commonjs”以明确表示)。

答案 1 :(得分:4)

我遇到了非常相似的问题。我必须安装 nodemon 并始终通过 nodemon index.ts

启动脚本
yarn add -D nodemon

package.json

"scripts": {
   "start": "nodemon index.ts"
}

或从命令行指定文件

package.json

"scripts": {
   "nodemon": "nodemon $1"
}

答案 2 :(得分:1)

安装软件包ts-node并更改package.json

"scripts": {
    "dev": "ts-node index.ts"
  }

答案 3 :(得分:0)

获取的可能性很多,

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

运行打字稿时

在设置中,我从脚本AbModule中导入了一个名为AbModuleAbClassName具有类testab.ts)的模块。

testab.tsimport stmt

import {AbClassName} = 'testAdapterDir/AbModule.po.ts';

但是, AbModule拥有所有*.ts个文件,并且不存在*.js个文件。 解决方法是

在运行以下代码时可能会出错,但是可以放心地忽略它们。

cd AbModule path
tsc *.ts

现在AbModule也应该包含所有*.js的编译文件。 现在运行testab.ts,发现上述错误不再存在

答案 4 :(得分:0)

确保 "main" 中的 package.json 字段指向编译后的 index.js 而不是 index.ts