引言:“您的 .ts 文件打不开?您并不孤单”
\n\n想象一下:您正在编写一段很酷的 TypeScript 代码,将文件保存为 .ts 扩展名,然后运行命令 node myfile.ts……却得到类似这样的回复:“Unknown file extension ".ts"”。熟悉吗?如果您浏览过 Stack Overflow,就会知道这个问题已经积累了数千次浏览和数百条评论。这个问题虽然古老,但至今仍然存在。
在本文中,我们不仅仅是复制论坛上的答案。我们将深入分析为什么会发生这种情况,如何修复它,以及应该怎么做才能永远不再遇到这个错误。您将学习如何正确配置 TypeScript 项目,使用 ts-node 和 tsconfig.json 配置。我们开始吧!
为什么会出现“未知文件扩展名 ".ts"”错误?
\n\n让我们直接切入正题。Node.js 默认情况下无法识别 .ts 文件。它只认识 .js、.json、.mjs 和 .cjs。当您输入 node myfile.ts 时,Node.js 会诚实地尝试将 TypeScript 代码作为普通 JavaScript 执行,但会遇到它不熟悉的语法(例如类型、接口、泛型)。
结果就是——错误。但还有另一种情况:您使用了 ts-node 或 tsx,但仍然看到相同的消息。为什么?因为在现代版本的 Node.js(从第 16 版开始)中,对 package.json 中的扩展名添加了严格检查,特别是当设置了 "type": "module" 时。
主要原因:
\n- \n
- 直接运行
node file.ts— Node.js 无法即时编译 TypeScript。 \n - 缺少
ts-node或tsx— 没有用于转译的工具。 \n tsconfig.json配置错误 — 例如,未指定模块或目标。 \n package.json问题 — 如果设置了"type": "module",则ts-node可能需要显式指定扩展名。 \n
解决方案 1:使用 ts-node(经典方法)
\n\n在不预先编译的情况下运行 TypeScript 的最简单方法是使用 ts-node。这个包会将 .ts 文件编译到内存中,并将结果传递给 Node.js。
安装与运行
\nnpm install -g ts-node\nts-node myfile.ts\n\n如果您使用本地项目,最好将其安装为开发依赖项:
\nnpm install --save-dev ts-node\nnpx ts-node myfile.ts\n\n一个简单的 hello.ts 文件示例:
const greet = (name: string): string => {\n return `你好,${name}!`;\n};\n\nconsole.log(greet("世界"));\n\n运行:npx ts-node hello.ts — 您会在控制台中看到 "你好,世界!"。成功了!
但有一个问题:"type": "module"
\n如果您的 package.json 中指定了 "type": "module",那么 ts-node 可能会拒绝工作。在这种情况下,您需要暂时删除这一行,或者使用 --esm 标志:
npx ts-node --esm myfile.ts\n\n解决方案 2:使用 tsx(现代工具)
\n\ntsx 是 ts-node 的更快的替代方案,基于 esbuild。它开箱即用地支持 ESM,并且不需要额外的标志。
安装:
\nnpm install --save-dev tsx\n\n运行:
\nnpx tsx myfile.ts\n\n使用现代 TypeScript 功能的示例:
\n// types.ts\nexport interface User {\n id: number;\n name: string;\n email: string;\n}\n\nconst user