为什么TypeScript是你作品集中的王牌?
\n\nJavaScript的世界就像狂野西部。动态类型带来了自由,但常常让代码变成一场赌博。TypeScript就像一位警长,来维持秩序。如果你不仅想写代码,还想构建可靠、可扩展的系统——那么作品集中的TypeScript项目会为你说明一切。
\n\n想象一下:你去面试。其他人都带着标准的React待办事项列表。而你有一个完全类型化的Telegram机器人,带有认证、实时聊天,或者你自己的小型编译器。承认吧,这听起来更有分量。在本文中,我们将探讨5个TypeScript作品集创意,它们不仅能提升你的技能,还能让招聘人员对你的GitHub流连忘返。
\n\n选择标准:什么让项目变得“顶级”?
\n\n在深入代码之前,让我们先达成共识。一个好的TypeScript个人项目应该:
\n- \n
- 解决一个实际问题(或者至少模拟这一点)。 \n
- 使用TypeScript的高级特性:泛型、装饰器、工具类型。 \n
- 有测试——代码覆盖率显示你的责任心。 \n
- 有文档——包含安装和使用示例的README。 \n
准备好了吗?开始吧!
\n\n1. 完全类型化的财务管理Telegram机器人
\n\n机器人是经典。但用TypeScript构建一个架构良好的机器人本身就是一种挑战。我们不只是挂载一个“你好”处理器,而是构建一个带有DI容器和严格模型的微服务。
\n\n内部包含什么?
\n- \n
- 数据库(SQLite或PostgreSQL)配合TypeORM。 \n
- 命令:/add_expense, /stats, /budget。 \n
- 通过枚举定义支出类别。 \n
代码示例:类型化模型和命令
\n\n// models/Expense.ts\nimport { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';\nimport { Category } from './enums';\n\n@Entity()\nexport class Expense {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column()\n userId!: number;\n\n @Column('decimal', { precision: 10, scale: 2 })\n amount!: number;\n\n @Column({\n type: 'enum',\n enum: Category,\n default: Category.OTHER\n })\n category!: Category;\n\n @CreateDateColumn()\n createdAt!: Date;\n}\n\n// commands/addExpense.ts\nimport { Context } from 'telegraf';\nimport { getRepository } from 'typeorm';\nimport { Expense } from '../models/Expense';\nimport { Category } from '../models/enums';\n\nexport async function addExpense(ctx: Context, amount: number, category: Category) {\n const repo = getRepository(Expense);\n const expense = repo.create({\n userId: ctx.from!.id,\n amount,\n category\n });\n await repo.save(expense);\n await ctx.reply(`✅ 已添加:${amount} 卢布,类别:${category}`);\n}\n\n\n为什么这很酷?你展示了通过ORM使用数据库的能力,对异步的理解以及严格的数据类型化。此外,这是一个真实的使用场景。
\n\n2. 基于WebSocket + React的实时看板任务板
\n\n做一个待办事项列表很无聊。做一个支持拖放和WebSocket的多用户看板,用TypeScript实现——这才有趣。在这里,你展示了自己作为全栈开发者的能力。
\n\n架构
\n- \n
- 后端:Express + Socket.io + TypeScript。 \n
- 前端:React + react-beautiful-dnd + Redux Toolkit。 \n
- 所有事件的类型化(socket事件作为联合类型)。 \n
示例:类型化的WebSocket处理器
\n\n// types/socket-events.ts\nexport interface ServerToClientEvents {\n taskMoved: (task: Task, fromColumn: ColumnId, toColumn: ColumnId) => void;\n newTask: (task: Task) => void;\n}\n