TypeScript开发Discord机器人import模块报错如何解决
问题根因
两个报错都是配置不匹配导致的:
- 最初的
Cannot use import statement outside a module是因为Node默认采用CommonJS模块规范,不支持ES模块的import语法 - 加了
"type": "module"后Node切换为ES模块规范,但此时出现Unknown file extension ".ts"是两个原因共同导致:一是Node原生不识别.ts后缀文件,二是tsconfig.json中的module配置为commonjs,和ES模块环境冲突,编译输出的代码规范和运行环境不匹配。
解决方案步骤
- 调整
tsconfig.json的模块相关配置,对齐ES模块规范 - 安装TypeScript、ts-node等必要的开发依赖
- 修改
package.json的入口和启动脚本,适配编译流程和开发调试需求 - 后续导入本地自定义模块时,需要补全
.js后缀(即使源文件是.ts格式,TypeScript会自动适配识别)
修改后的配置示例
tsconfig.json
{ "compilerOptions": { "lib": ["ESNext"], "target": "ESNext", "module": "NodeNext", "moduleResolution": "NodeNext", "outDir": "./dist", "strict": true, "allowSyntheticDefaultImports": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true }, "include": [ "index.ts", "commands/*.ts" ], "exclude": ["node_modules"] }
package.json
首先安装开发依赖:npm install --save-dev typescript @types/node ts-node
修改后的配置:
{ "name": "wdr", "version": "1.0.0", "description": "A discord bot", "main": "./dist/index.js", "type" : "module", "scripts": { "build": "tsc", "dev": "node --no-warnings --loader ts-node/esm index.ts", "start": "node dist/index.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "wdr", "license": "ISC", "dependencies": { "@discordjs/rest": "^0.1.0-canary.0", "discord-api-types": "^0.24.0", "discord.js": "^13.3.1", "dotenv": "^10.0.0" }, "devDependencies": { "@types/node": "^18.11.0", "ts-node": "^10.9.1", "typescript": "^4.9.0" } }
index.ts
原有代码无需改动,没有配置问题。
使用方式
- 开发调试:执行
npm run dev即可直接运行.ts源文件 - 生产部署:先执行
npm run build将TS代码编译为JS文件输出到dist目录,再执行npm run start启动程序。
内容的提问来源于stack exchange,提问作者Sylent
相关产品推荐
相关产品推荐

