"SyntaxError: Cannot use import statement outside a module" 但是tsconfig.json"模块"已经"commonjs"



我对typescript有点陌生,我正在别人现有存储库的一个分支中工作,试图对它运行测试。

我写了一个测试脚本examples/test.ts,并试图使用vscode调试器调试它。当我使用ts-node ./examples/test.ts运行脚本时,脚本执行成功。然而,当我尝试使用vscode调试器运行它时,我得到了著名的SyntaxError: Cannot use import statement outside a module。这个错误发生在我的typescript测试的第1行,我第一次尝试import {Foo} from '../dist',其中Foo是一个被测试的对象。

尝试修复

我已经研究了一段时间,最常见的修复方法似乎是在tsconfig.jsoncompilerOptions中将module设置为commonjs。但是,这个项目已经正确地设置了。

另一个常见的修复是在package.json中设置"type":"module",但是当我这样做时,我会在vscode调试器中导致新的错误。具体来说,是Uncaught TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /path/truncated/by/me/examples/test.ts。我可以在调试器之外正常运行脚本的事实使我认为它更有可能是tsconfig.json或类似的配置,当然我可能是错的。

相关配置文件:

.vscode/launch.json

{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/examples/test.ts",
"preLaunchTask": "tsc: build - tsconfig.json",
"outFiles": [
"${workspaceFolder}/dist/**/*.js"
]
}
]
}

tsconfig.json

{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"lib": ["es2015", "dom"],
"allowJs": true,
"skipLibCheck": true,
"sourceMap": true,
"outDir": "dist",
"strict": true,
"noImplicitAny": true,
"moduleResolution": "node",
"baseUrl": "./",
"esModuleInterop": true
},
"include": ["*"],
"exclude": ["node_modules"]
}

在最新macOS上运行VSCode 1.52.1。ts-node --version给出v9.1.1,项目使用v12.14.1中的node --version

我确实遇到了这个问题。以下是我的cli项目最终成功的方法(使用vscode 1.61.2).

launch.json:

{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Program",
"program": "${workspaceFolder}/src/cli.ts",
"request": "launch",
"preLaunchTask": "npm: build",
"skipFiles": ["<node_internals>/**"],
"type": "pwa-node"
}
]
}

tsconfig.json:

{
"compilerOptions": {
"target": "ES2020" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
"module": "commonjs" /* Specify what module code is generated. */,
"esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */,
"forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
"strict": true /* Enable all strict type-checking options. */,
"skipLibCheck": true /* Skip type checking all .d.ts files. */,
"outDir": "./lib",
"importHelpers": false,
"sourceMap": true
}
}

包。

"scripts": {
"start": "node lib/cli.js",
"build": "tsc"
},

包。json devDependencies

"devDependencies": {
"@types/node": "^16.11.6",
"typescript": "^4.4.4"
},

相关内容

最新更新