Why TypeScript is Your Ace in the Hole for Your Portfolio?
\n\nThe world of JavaScript is the Wild West. Dynamic typing grants freedom but often turns code into a game of roulette. TypeScript arrives like a sheriff who restores order. If you want not just to write code, but to build reliable, scalable systems — TypeScript projects in your portfolio will speak volumes for you.
\n\nImagine: you go to an interview. Everyone has standard React TODO lists. But you have a fully-typed Telegram bot with authorization, a real-time chat, or your own tiny compiler. You'll agree, it sounds more impressive. In this article, we'll break down 5 ideas for a TypeScript portfolio that will not only boost your skills but also make recruiters linger on your GitHub.
\n\nSelection Criteria: What Makes a Project "Top-Notch"?
\n\nBefore diving into code, let's agree. A good TypeScript pet project should:
\n- \n
- Solve a real problem (or at least simulate it). \n
- Use advanced TS features: generics, decorators, utility types. \n
- Have tests — code coverage shows your responsibility. \n
- Be documented — a README with installation and usage examples. \n
Ready? Let's go!
\n\n1. Telegram Bot for Finance Management with Full Typing
\n\nBots are classics. But making a bot with TypeScript and proper architecture is already a challenge. We won't just hang a handler on "Hello," but build a microservice with DI containers and strict models.
\n\nWhat's Inside?
\n- \n
- Database (SQLite or PostgreSQL) with TypeORM. \n
- Commands: /add_expense, /stats, /budget. \n
- Expense categories via enum. \n
Code Example: Typed Model and Command
\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(`✅ Added: ${amount} RUB in category ${category}`);\n}\n\n\nWhy is this cool? You demonstrate the ability to work with a database via ORM, understanding of asynchrony, and strict data typing. Plus, it's a real-world use case.
\n\n2. Real-time Task Board (Kanban) on WebSocket + React
\n\nMaking a TODO list is boring. Making a multi-user Kanban with drag-and-drop and WebSocket in TypeScript is already interesting. Here you reveal yourself as a fullstack developer.
\n\nArchitecture
\n- \n
- Backend: Express + Socket.io + TypeScript. \n
- Frontend: React + react-beautiful-dnd + Redux Toolkit. \n
- Typing all events (socket events as union types). \n
Example: Typed WebSocket Handler
\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