引言:为什么需要在 TypeScript 中处理文件系统?
\n\n每个应用程序迟早都会遇到与文件系统交互的需求:保存配置、处理上传的文件、记录日志或管理项目。TypeScript 作为 JavaScript 的超集,通过 Node.js 的 fs(文件系统)模块为开发者提供了强大的文件和目录操作工具。
在本文中,我们将通过实际示例详细讲解 TypeScript 中文件系统的基本操作:文件的读取和写入、目录的创建和删除,以及错误处理。所有示例都将使用严格的类型定义,这是 TypeScript 的关键优势。
\n\n用于文件系统操作的主要模块
\n\n在开始实践之前,我们先来了解三个需要用到的主要模块:
\n\n- \n
- fs — 用于文件系统操作(读取、写入、删除)的核心模块 \n
- fs/promises — 支持 Promise 的
fs模块版本(推荐用于现代代码) \n - path — 用于处理文件和目录路径的实用工具 \n
在 TypeScript 中导入模块请使用以下语法:
\n\nimport * as fs from 'fs';\nimport * as fsPromises from 'fs/promises';\nimport * as path from 'path';\n\n请注意:为了在 TypeScript 中正常工作,请确保您的 tsconfig.json 文件中设置了 "moduleResolution": "node" 和 "esModuleInterop": true 选项。
读取文件:同步与异步方法
\n\n带类型定义的同步读取
\n\n同步方法会阻塞代码执行,直到操作完成。仅适用于小文件或应用程序的初始加载:
\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nfunction readConfigSync(): Record<string, unknown> {\n const configPath = path.join(__dirname, 'config.json');\n \n try {\n const data = fs.readFileSync(configPath, 'utf-8');\n return JSON.parse(data) as Record<string, unknown>;\n } catch (error) {\n if (error instanceof Error) {\n console.error('读取配置错误:', error.message);\n }\n return {};\n }\n}\n\nconst config = readConfigSync();\nconsole.log('配置已加载:', config);\n\n使用 async/await 进行异步读取(推荐方式)
\n\n对于生产环境代码,请始终使用异步方法。TypeScript 与 async/await 配合良好:
\n\nimport { readFile } from 'fs/promises';\nimport * as path from 'path';\n\ninterface UserData {\n id: number;\n name: string;\n email: string;\n}\n\nasync function readUserData(fileName: string): Promise<UserData[]> {\n const filePath = path.resolve('data', fileName);\n \n try {\n const rawData = await readFile(filePath, { encoding: 'utf-8' });\n const users: UserData[] = JSON.parse(rawData);\n return users;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`无法读取文件 ${fileName}:${error.message}`);\n }\n throw error;\n }\n}\n\n// 使用\n(async () => {\n try {\n const users = await readUserData('users.json');\n console.log(`已加载 ${users.length} 个用户`);\n } catch (error) {\n console.error(error);\n }\n})();\n\n写入和更新文件
\n\n创建和覆盖文件
\n\n要将数据写入文件,请使用 writeFile 方法。如果文件不存在,它会创建文件;如果文件已存在,则会覆盖:
import { writeFile, mkdir } from 'fs/promises';\nimport * as path from 'path';\n\ninterface LogEntry {\n timestamp: string;\n level: 'info' | 'warn' | 'error';\n message: string;\n}\n\n