Typsichere Formulare und API-Response-Verträge
Verwenden Sie Zod, um TypeScript-Typen aus Schemas abzuleiten und sowohl Formulardaten als auch API-Antworten zu validieren.
Typsichere Formulare und API-Response-Verträge ist eine kostenlose React Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des React Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum typsichere Datenstrukturen wichtig sind
Formulare und API-Antworten sind Grenzen, an denen Daten aus nicht vertrauenswürdigen Quellen in Ihre Anwendung gelangen. Mit Zod können Sie Schemas definieren, die sowohl zur Laufzeit validieren als auch TypeScript-Typen ableiten.
Grundlagen von Zod-Schemas
Definieren Sie Schemas mit der Fluent API von Zod. Verwenden Sie z.infer<typeof schema>, um den TypeScript-Typ zu extrahieren.
import { z } from 'zod';
const UserSchema = z.object({
id: z.string().uuid(),
name: z.string().min(1).max(100),
email: z.string().email(),
age: z.number().int().min(0).max(150).optional(),
role: z.enum(['admin', 'user', 'guest']),
});
type User = z.infer<typeof UserSchema>;
// { id: string; name: string; email: string; age?: number; role: 'admin'|'user'|'guest' }React Hook Form mit Zod-Resolver
Integrieren Sie Zod-Schemas mit React Hook Form für typsichere Formularvalidierung – TypeScript kennt die Struktur der Formulardaten und der Fehler.
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
const LoginSchema = z.object({
email: z.string().email('Invalid email'),
password: z.string().min(8, 'At least 8 characters'),
});
type LoginData = z.infer<typeof LoginSchema>;
function LoginForm() {
const { register, handleSubmit, formState: { errors } } = useForm<LoginData>({
resolver: zodResolver(LoginSchema),
});
const onSubmit = (data: LoginData) => {
// data is LoginData — fully typed, already validated
};
}API-Antworten validieren
Parsen Sie API-Antworten mit Zod, um Abweichungen von der erwarteten Struktur an der Grenze zu erkennen – wenn die API unerwartete Daten zurückgibt, erhalten Sie einen detaillierten Fehler statt eines Laufzeitabsturzes tief in Ihrer Komponente.
async function fetchUser(id: string): Promise<User> {
const res = await fetch(`/api/users/${id}`);
const json = await res.json();
return UserSchema.parse(json); // throws ZodError if shape is wrong
}Safe Parse für kontrollierte Fehlerbehandlung
Verwenden Sie schema.safeParse(), um ein Ergebnisobjekt zu erhalten, statt eine Exception auszulösen – ideal für die Formularvalidierung, wenn Sie dem Benutzer Fehler anzeigen möchten.
const result = UserSchema.safeParse(formData);
if (!result.success) {
const errors = result.error.flatten().fieldErrors;
// { name: ['Must be at least 1 character'], email: ['Invalid email'] }
return errors;
}
const user = result.data; // User — fully typedDiskriminierte Unions mit Zod
Verwenden Sie z.discriminatedUnion, um API-Antworten zu modellieren, die je nach Erfolgs-/Fehler-Flag unterschiedliche Strukturen haben.
const ApiResponse = z.discriminatedUnion('ok', [
z.object({ ok: z.literal(true), data: UserSchema }),
z.object({ ok: z.literal(false), error: z.string(), code: z.number() }),
]);
type ApiResult = z.infer<typeof ApiResponse>;
// { ok: true; data: User } | { ok: false; error: string; code: number }Zod-Transformationen
Verwenden Sie .transform(), um Daten beim Parsen zu konvertieren oder umzuformen – beispielsweise, um einen Datumsstring in ein Date-Objekt umzuwandeln.
const DateSchema = z.string().transform(s => new Date(s));
// Input: '2024-01-15' → Output: Date object
const EventSchema = z.object({
title: z.string(),
date: z.string().pipe(z.coerce.date()),
});
type Event = z.infer<typeof EventSchema>;
// { title: string; date: Date }Schemas wiederverwenden
Leiten Sie Erstellungs- und Aktualisierungsschemas aus dem Basisschema ab, um Duplikate zu vermeiden.
const UserSchema = z.object({ name: z.string(), email: z.string().email() });
// For creation: add password
const CreateUserSchema = UserSchema.extend({ password: z.string().min(8) });
// For update: all fields optional
const UpdateUserSchema = UserSchema.partial();
type CreateUser = z.infer<typeof CreateUserSchema>;
type UpdateUser = z.infer<typeof UpdateUserSchema>;Server Action mit Zod
Validieren Sie Formulardaten in einer Next.js Server Action mit Zod, bevor Sie auf die Datenbank zugreifen.
async function createPost(formData: FormData) {
'use server';
const schema = z.object({ title: z.string().min(3), body: z.string().min(10) });
const result = schema.safeParse(Object.fromEntries(formData));
if (!result.success) return { errors: result.error.flatten().fieldErrors };
await db.post.create({ data: result.data });
revalidatePath('/blog');
redirect('/blog');
}Gemeinsame Schemas zwischen Frontend und Backend
Exportieren Sie Zod-Schemas aus einem gemeinsamen Package, damit Frontend und Backend dieselbe Validierungslogik verwenden – ein Schema als Single Source of Truth.
// packages/schemas/src/user.ts
export const CreateUserSchema = z.object({ ... });
export type CreateUser = z.infer<typeof CreateUserSchema>;
// Frontend imports:
import { CreateUserSchema, CreateUser } from '@company/schemas';
// Backend imports:
import { CreateUserSchema } from '@company/schemas';Zod-Fehlermeldungen
Passen Sie die Fehlermeldungen für die einzelnen Felder an, um die UX zu verbessern – Zod übergibt sie über den Resolver automatisch an die Fehleranzeige des Formulars.
const RegistrationSchema = z.object({
username: z.string()
.min(3, 'Username must be at least 3 characters')
.max(20, 'Username cannot exceed 20 characters')
.regex(/^[a-z0-9_]+$/, 'Only lowercase letters, numbers, and underscores'),
});Kurztest
Was liefert z.infer
Zusammenfassung
Definieren Sie Zod-Schemas einmal und leiten Sie mit z.infer TypeScript-Typen daraus ab. Verwenden Sie zodResolver in React Hook Form für typsichere Validierung. Parsen Sie API-Antworten mit Zod an der Systemgrenze, verwenden Sie safeParse für benutzerfreundliche Fehlermeldungen und teilen Sie Schemas über ein gemeinsames Package zwischen Frontend und Backend.
Häufig gestellte Fragen
Ist die Lektion „Typsichere Formulare und API-Response-Verträge“ kostenlos?
Ja — der vollständige Text von „Typsichere Formulare und API-Response-Verträge“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des React Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Typsichere Formulare und API-Response-Verträge“?
Verwenden Sie Zod, um TypeScript-Typen aus Schemas abzuleiten und sowohl Formulardaten als auch API-Antworten zu validieren. Du übst React Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um React Academy zu starten?
Keine Vorkenntnisse erforderlich. React Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Typsichere Formulare und API-Response-Verträge“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser React Academy-Lektion Code schreiben und ausführen?
Ja. Jede React Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Discriminated Unions für Component-Varianten
- Bedingte und gemappte Types in React
- Polymorphe Components mit der 'as'-Prop
- Typsichere Formulare und API-Response-Verträge