TypeScript 与文件:15分钟从新手到专家

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么在 TypeScript 中操作文件并不可怕,反而很方便

\n\n

当我刚开始用 TypeScript 写代码时,我被一个想法吓到了:“文件怎么办?在浏览器里很简单,但这里——服务器、磁盘、路径……”但事实证明,在 TypeScript 中操作文件和文件系统就像搭乐高积木:有清晰的零件(fs 和 path 模块),有说明书(类型系统),结果也是可预测的。没有意外,只有干净的代码。

\n\n

在本文中,我们将学习如何使用现代的 TypeScript for Node.js 来读取、写入、重命名和删除文件。您将了解为什么应该使用 fs/promises 而不是老式的 fs,如何避免在路径中迷失方向,以及如何优雅地处理错误。我们开始吧!

\n\n

准备工作:开始前需要了解的内容

\n\n

在深入代码之前,请确保您已安装 Node.js(版本 14+,已原生支持 Promise)。同时创建一个简单的项目:

\n\n
mkdir 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\n

如今,用于文件操作的最正确的模块导入方式是:

\n\n
import { 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

读取文件:从简单到安全

\n\n

我们从经典操作开始——读取一个文本文件。假设我们有一个包含某些内容的 data.txt 文件。

\n\n
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\n
import { 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 函数会覆盖已存在的文件,或创建一个新文件。

\n\n
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                

博客

书籍推荐