Einleitung: Warum TypeScript und REST API das ideale Paar für schnelle Entwicklung sind
\nModerne Webentwicklung erfordert Geschwindigkeit und Zuverlässigkeit. Wenn Sie schnell ein Backend für eine mobile App, einen Webdienst oder eine Microservice-Architektur erstellen müssen, ist die Kombination TypeScript + Node.js + Express eines der effektivsten Werkzeuge. TypeScript fügt JavaScript eine strenge Typisierung hinzu, wodurch Fehler bereits zur Kompilierungszeit und nicht erst zur Laufzeit abgefangen werden können. Dies ist besonders wertvoll beim Aufbau einer REST API, bei der jeder Endpunkt genau wissen muss, welche Daten er empfängt und zurückgibt.
\nIn diesem Artikel erstellen wir in 30 Minuten eine vollwertige REST API zur Verwaltung einer Aufgabenliste (To-Do-Liste). Sie lernen, wie Sie das Projekt einrichten, Controller, Routen und Middleware schreiben. Alles anhand praktischer Beispiele mit fertigem Code.
\n\nVorbereitung und Einrichtung des Projekts (5 Minuten)
\nAls erstes erstellen wir die Projektstruktur und installieren die Abhängigkeiten.
\nmkdir todo-api\ncd todo-api\nnpm init -y\nnpm install express cors uuid\nnpm install -D typescript @types/express @types/cors @types/uuid ts-node nodemon\nErstellen Sie die Datei tsconfig.json im Projektstammverzeichnis:
{\n "compilerOptions": {\n "target": "ES2020",\n "module": "commonjs",\n "outDir": "./dist",\n "rootDir": "./src",\n "strict": true,\n "esModuleInterop": true,\n "skipLibCheck": true\n },\n "include": ["src/**/*"]\n}\nFügen Sie Skripte in package.json hinzu:
"scripts": {\n "dev": "nodemon --exec ts-node src/index.ts",\n "build": "tsc",\n "start": "node dist/index.js"\n}\nErstellen Sie den Ordner src und die Datei index.ts als Einstiegspunkt.
Basisordnerstruktur
\n- \n
src/index.ts— Einstiegspunkt, Serverstart \n src/routes/tasks.ts— Routen für Aufgaben \n src/controllers/taskController.ts— Logik zur Anfrageverarbeitung \n src/models/task.ts— Schnittstellen und Typen \n src/middleware/errorHandler.ts— Fehlerbehandlung (optional) \n
Erstellung des Datenmodells und der Schnittstellen (5 Minuten)
\nDefinieren wir die Datentypen für unsere Aufgabe. Erstellen Sie die Datei src/models/task.ts:
export interface Task {\n id: string;\n title: string;\n completed: boolean;\n createdAt: Date;\n}\n\nexport type CreateTaskDto = Pick<Task, 'title'>;\nexport type UpdateTaskDto = Partial<Pick<Task, 'title' | 'completed'>>;\nHier verwenden wir Pick und Partial — integrierte Hilfstypen von TypeScript. CreateTaskDto akzeptiert nur den Titel, während UpdateTaskDto optionale Felder für teilweise Aktualisierungen bereitstellt.
Schreiben der Controller und Routen (15 Minuten)
\nJetzt kommt der spannendste Teil – die Anwendungslogik. Wir erstellen einen temporären In-Memory-Speicher für Aufgaben. Für die Produktion sollte dieser durch eine Datenbank ersetzt werden.
\n\nAufgaben-Controller
\nDatei src/controllers/taskController.ts:
import { Request, Response } from 'express';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Task, CreateTaskDto, UpdateTaskDto } from '../models/task';\n\n// Temporärer Speicher\nlet tasks: Task[] = [];\n\n// GET /api/tasks\nexport const getAllTasks = (req: Request, res: Response) => {\n res.json(tasks);\n};\n\n// GET /api/tasks/:id\nexport const getTaskById = (req: Request, res: Response) => {\n const task = tasks.find(t => t.id === req.params.id);\n if (!task) {\n return res.status(404).json({ message: 'Aufgabe nicht gefunden' });\n }\n res.json(task);\n};\n\n// POST /api/tasks\nexport const createTask = (req: Request, res: Response) => {\n const { title } = req.body as CreateTaskDto;\n if (!title || typeof title !== 'string') {\n return res.status(400).json({ message: 'Feld title ist erforderlich und muss