为什么 TypeScript 是自动化的理想语言
每位开发者至少都曾花费数小时手动重命名 200 个文件、从十几个页面收集数据或将 JSON 转换为所需格式。日常琐事会扼杀生产力和动力。但好消息是:TypeScript 自动化可以快速而优雅地解决这些问题。
TypeScript 不仅仅是 JavaScript 的超集。它拥有严格的类型检查、可读性强的代码以及强大的 Node.js 生态系统。如果您使用 Python 但正在寻找自动化的替代方案,或者已经在使用 TS 并希望充分利用它,那么这篇文章适合您。我们将分析实际案例:从网页解析到创建 CLI 工具和任务调度器。
入门:环境设置
在编写 TypeScript 脚本之前,需要准备好环境。确保您已安装 Node.js(18+ 版本)和 npm。
# 全局安装 TypeScriptnpm install -g typescript
# 初始化项目mkdir auto-ts && cd auto-tsnpm init -ynpm install typescript @types/node ts-node --save-dev创建包含基本配置的 tsconfig.json 文件:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true }, "include": ["src/**/*"]}现在可以在 src 文件夹中编写脚本,并通过 ts-node src/script.ts 运行它们。这是任何 ts 任务自动化的基础。
案例 1:自动网页解析
想象一下:您需要从新闻网站首页收集新闻标题。手动复制粘贴已经过时了。让我们使用 cheerio 和 axios 编写一个 TypeScript 解析器。
npm install axios cheerio创建文件 src/parser.ts:
import axios from 'axios';import * as cheerio from 'cheerio';
interface NewsItem { title: string; link: string;}
async function parseNews(url: string): Promise<NewsItem[]> { const { data } = await axios.get(url); const $ = cheerio.load(data); const news: NewsItem[] = [];
$('h2.news-title a').each((i, el) => { news.push({ title: $(el).text().trim(), link: $(el).attr('href') || '', }); });
return news;}
(async () => { const items = await parseNews('https://example-news-site.com'); console.log(`找到 ${items.length} 条新闻:`); items.forEach(item => console.log(`- ${item.title}`));})();这个 TypeScript 解析可以轻松扩展:添加 CSV 写入、发送到 Telegram 或保存到数据库。NewsItem 的类型定义使代码可靠且易于理解。
案例 2:批量文件处理
假设您有一个包含上百个 CSV 文件的文件夹,需要将它们合并为一个并删除重复项。手动操作需要一整天。TypeScript 自动化可以在几秒钟内完成。
npm install fs-extra papaparseimport * as fs from 'fs-extra';import * as path from 'path';import Papa from 'papaparse';
interface Row { [key: string]: string;}
async function mergeCSV(inputDir: string, outputFile: string): Promise<void> { const files = (await fs.readdir(inputDir)).filter(f => f.endsWith('.csv')); const allRows: Row[] = []; const seen = new Set<string>();
for (const file of files) { const content = await fs.readFile(path.join(inputDir, file), 'utf-8'); const parsed = Papa.parse<Row>(content, { header: true }); for (const row of parsed.data) { const key = JSON.stringify(row); if (!seen.has(key)) { seen.add(key); allRows.push(row);