如何无需转译直接运行单行TypeScript文件?
如何无需转译直接运行单行TypeScript文件?
我的问题背景
我是TypeScript新手,想不用转译直接通过ts-node运行单行TS程序。我的环境配置如下:
我已经执行了以下全局安装命令:
npm install -g typescript npm install -g ts-node
我的TS代码很简单:
Console.log("Hello World");
但运行命令 ts-node "g:\New folder\Session1.ts" 时,出现了如下错误:
PS G:\New folder> ts-node "g:\New folder\Session1.ts" (node:5020) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension. (Use `node --trace-warnings ...` to show where the warning was created) g:\New folder\Session1.ts:2 export {}; ^^^^^^ SyntaxError: Unexpected token 'export' at internalCompileFunction (node:internal/vm:73:18) at wrapSafe (node:internal/modules/cjs/loader:1178:20) at Module._compile (node:internal/modules/cjs/loader:1220:27) at Module.m._compile (C:\Users\user\AppData\Roaming\npm\node_modules\ts-node\src\index.ts:1618:23) at Module._extensions..js (node:internal/modules/cjs/loader:1310:10) at Object.require.extensions.<computed> [as .ts] (C:\Users\user\AppData\Roaming\npm\node_modules\ts-node\src\index.ts:1621:12) at Module.load (node:internal/modules/cjs/loader:1119:32) at Function.Module._load (node:internal/modules/cjs/loader:960:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) at phase4 (C:\Users\user\AppData\Roaming\npm\node_modules\ts-node\src\bin.ts:649:14)
我没有任何导入导出语句,原本以为不用package.json也能运行,但即使添加了package.json问题依然存在,求帮忙解决!
解决方案
别担心,这个问题本质是ts-node默认的模块配置和Node.js的模块系统不匹配导致的,我给你几个简单可行的解决办法:
方法1:命令行直接指定模块模式
运行ts-node的时候加上--esm或--cjs参数,强制统一模块系统,比如:
# 使用ES模块模式运行 ts-node --esm "g:\New folder\Session1.ts" # 或者使用CommonJS模式(Node.js默认) ts-node --cjs "g:\New folder\Session1.ts"
方法2:创建tsconfig.json统一配置
在你的TS文件所在目录新建一个tsconfig.json,明确指定编译器使用CommonJS模块:
{ "compilerOptions": { "module": "CommonJS", "target": "ES6" } }
之后再运行原来的ts-node命令,就能正常执行了。
方法3:修正代码的小细节
另外提个小问题:你的代码里Console是大写的C,但TypeScript里全局控制台对象是小写的console,虽然这不是当前报错的原因,但修正后才能正确输出内容:
console.log("Hello World");
方法4:正确配置package.json(如果要用的话)
如果坚持用package.json,要确保模块配置和ts-node匹配。比如package.json里设置ES模块:
{ "type": "module", "devDependencies": { "ts-node": "^10.9.1", "typescript": "^5.2.2" } }
同时在tsconfig.json里对应设置:
{ "compilerOptions": { "module": "ESNext" } }
这样两者模块系统一致,就不会再出现冲突了。
备注:内容来源于stack exchange,提问作者Brijesh Roy
相关产品推荐
相关产品推荐

