为什么在 TypeScript 中操作文件并不可怕,反而很方便
\n\n当我刚开始用 TypeScript 写代码时,我被一个想法吓到了:“文件怎么办?在浏览器里很简单,但这里——服务器、磁盘、路径……”但事实证明,在 TypeScript 中操作文件和文件系统就像搭乐高积木:有清晰的零件(fs 和 path 模块),有说明书(类型系统),结果也是可预测的。没有意外,只有干净的代码。
在本文中,我们将学习如何使用现代的 TypeScript for Node.js 来读取、写入、重命名和删除文件。您将了解为什么应该使用 fs/promises 而不是老式的 fs,如何避免在路径中迷失方向,以及如何优雅地处理错误。我们开始吧!
准备工作:开始前需要了解的内容
\n\n在深入代码之前,请确保您已安装 Node.js(版本 14+,已原生支持 Promise)。同时创建一个简单的项目:
\n\nmkdir ts-files-demo\ncd ts-files-demo\nnpm init -y\nnpm install typescript @types/node --save-dev\nnpx tsc --init\n\n在 tsconfig.json 文件中,务必启用 "module": "NodeNext" 或 "ESNext" 以及 "target": "ES2022"。现在,您已经准备好进行 TypeScript 文件系统操作了。
始终会用到的导入语句
\n\n如今,用于文件操作的最正确的模块导入方式是:
\n\nimport { readFile, writeFile, unlink, mkdir, access } from 'fs/promises';\nimport { join, dirname, basename, extname } from 'path';\nimport { fileURLToPath } from 'url';\n\n请注意:我们不使用带回调的 fs。只使用 fs/promises——这是现代标准,与 async/await 和 TypeScript 类型系统完美配合。
读取文件:从简单到安全
\n\n我们从经典操作开始——读取一个文本文件。假设我们有一个包含某些内容的 data.txt 文件。
import { readFile } from 'fs/promises';\n\nasync function readTextFile(filePath: string): Promise<string> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return content;\n } catch (error) {\n console.error('读取文件时出错:', error);\n throw error;\n }\n}\n\n// 使用示例\nconst data = await readTextFile('./data.txt');\nconsole.log(data);\n\n很简单,对吧?但在实际项目中,我们经常处理 JSON。让我们创建一个带泛型的通用函数:
\n\nimport { readFile } from 'fs/promises';\n\nasync function readJsonFile<T>(filePath: string): Promise<T> {\n const raw = await readFile(filePath, 'utf-8');\n return JSON.parse(raw) as T;\n}\n\n// 示例:读取配置文件\ninterface Config {\n port: number;\n dbUrl: string;\n}\n\nconst config = await readJsonFile<Config>('./config.json');\nconsole.log(config.port); // 类型为 number——TypeScript 会自动提示\n\n这就是 TypeScript 文件操作的最佳实践:类型系统保护您免受愚蠢错误的影响,同时代码保持可读性。
\n\n写入文件:创建和更新数据
\n\n现在我们来学习如何保存信息。writeFile 函数会覆盖已存在的文件,或创建一个新文件。
import { writeFile, mkdir } from 'fs/promises';\nimport { dirname } from 'path';\n\nasync function saveToFile(filePath: string, data: string): Promise<void> {\n // 首先确保目录存在\n const dir = dirname(filePath);\n await mkdir(dir, { recursive: true });\n\n // 现在写入文件\n await writeFile(filePath, data, 'utf-8');\n console.log(`文件 ${filePath} 已成功保存`);\n}\n\n// 将对象保存为 JSON\nconst user = { name: '安娜', age: 28, role: 'admin' };\n