Wie man in 30 Minuten eine REST API mit TypeScript schreibt: in der Praxis

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum TypeScript und REST API das ideale Paar für schnelle Entwicklung sind

\n

Moderne 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.

\n

In 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\n

Vorbereitung und Einrichtung des Projekts (5 Minuten)

\n

Als erstes erstellen wir die Projektstruktur und installieren die Abhängigkeiten.

\n
mkdir 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
\n

Erstellen Sie die Datei tsconfig.json im Projektstammverzeichnis:

\n
{\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}
\n

Fügen Sie Skripte in package.json hinzu:

\n
"scripts": {\n  "dev": "nodemon --exec ts-node src/index.ts",\n  "build": "tsc",\n  "start": "node dist/index.js"\n}
\n

Erstellen Sie den Ordner src und die Datei index.ts als Einstiegspunkt.

\n\n

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
\n\n

Erstellung des Datenmodells und der Schnittstellen (5 Minuten)

\n

Definieren wir die Datentypen für unsere Aufgabe. Erstellen Sie die Datei src/models/task.ts:

\n
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'>>;
\n

Hier verwenden wir Pick und Partial — integrierte Hilfstypen von TypeScript. CreateTaskDto akzeptiert nur den Titel, während UpdateTaskDto optionale Felder für teilweise Aktualisierungen bereitstellt.

\n\n

Schreiben der Controller und Routen (15 Minuten)

\n

Jetzt 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\n

Aufgaben-Controller

\n

Datei src/controllers/taskController.ts:

\n
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                

Blogs

Buchempfehlungen