早上好,TypeScript:开发者的一天如何开始
\n\n想象一下:早上9:00。你打开笔记本电脑,泡好咖啡,看到Telegram上同事发来的消息:“嘿,我昨天写了一个函数,但TypeScript报错说类型是unknown。帮帮忙!”。熟悉吗?欢迎来到TypeScript开发者的典型工作日。这不仅仅是写代码——这是在强类型、截止日期和无尽的重构之间保持平衡的艺术。
\n\n在这篇文章中,我将向你展示TypeScript开发者的真实一天:从早上的站会到晚上的提交。你会看到真实的代码示例、典型问题及其解决方法。我们开始吧!
\n\n早上:站会和代码审查
\n\n9:30 — 每日站会
\n\n与团队的简短会议。你说:“昨天完成了授权模块,今天计划处理API响应的类型定义”。然后立刻听到:“你不想把接口放到单独的文件里吗?我们是有代码规范的”。TypeScript开发者总是想得更远:接口、泛型、工具类型。
\n\n示例:你们正在讨论服务器响应的类型定义。与其写any,你建议:
interface ApiResponse<T> {\n data: T;\n error: string | null;\n status: number;\n}\n\ntype User = {\n id: string;\n name: string;\n email: string;\n};\n\n// 使用\nconst response: ApiResponse<User[]> = await fetchUsers();\n\n\n同事们点头——这是正确的方法。TypeScript开发者知道:好的类型定义是成功的一半。
\n\n10:00 — 代码审查:在错误找到我们之前发现它们
\n\n站会后,你打开初级开发者的Pull Request。他写了一个验证电子邮件的函数。代码能运行,但TypeScript提示:Type 'string | undefined' is not assignable to type 'string'。你留下评论:
// ❌ 问题:未处理 null/undefined\nfunction validateEmail(input: string | null | undefined): boolean {\n if (!input) return false;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(input);\n}\n\n// ✅ 解决方案:使用守卫和可选链\nfunction validateEmail(input: unknown): input is string {\n return typeof input === 'string' && \n input.length > 0 && \n /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(input);\n}\n\n\n你解释道:TypeScript开发者总是考虑边界情况。类型定义不是限制,而是安全。
\n\n中午:编写代码和使用泛型
\n\n11:30 — 当天主要任务:重构遗留代码
\n\n你开始处理一个需要重写为TypeScript的旧JavaScript模块。里面有一个函数,接受“任何东西”并返回“任何东西”。经典:
\n\n// 🚫 旧JS代码\nfunction processData(data) {\n if (data.type === 'user') {\n return { id: data.id, name: data.name };\n }\n if (data.type === 'order') {\n return { orderId: data.id, total: data.total };\n }\n return null;\n}\n\n\n你使用可辨识联合将其转换为强类型代码:
\n\n// ✅ TypeScript版本\ntype UserData = { type: 'user'; id: string; name: string };\ntype OrderData = { type: 'order'; id: string; total: number };\ntype InputData = UserData | OrderData;\n\ntype ProcessedResult<T> = T extends UserData \n ? { id: string; name: string }\n : T extends OrderData \n ? { orderId: string; total: number }\n : never;\n\nfunction processData<T extends InputData>(data: T): ProcessedResult<T> {\n if (data.type === 'user') {\n return { id: data.id, name: data.name } as ProcessedResult<T>;\n }\n return { orderId: data.id, total: data.total } as ProcessedResult<T>;\n}\n\n\n现在TypeScript会根据输入数据自动推断出正确的结果类型。同事