
JavaScript'in dinamik tip sistemi, hızlı prototipleme için harika olsa da, büyüyen projelerde runtime hatalarına davetiye çıkarır. TypeScript, bu sorunu compile-time'da yakalayarak çözüyor, ancak gerçek tip güvenliği için sadece TypeScript kullanmak yetmez.
TypeScript tipleri compile-time'da çalışır, runtime'da yok olur. Dışarıdan gelen veriler (API request, DB response, env variables) için runtime validasyon şart:
import { z } from 'zod';// Schema tanımıconst UserSchema = z.object({id: z.string().uuid(),email: z.string().email(),name: z.string().min(2).max(100),role: z.enum(['admin', 'user', 'moderator']),createdAt: z.string().datetime(),});// Tip otomatik çıkarılırtype User = z.infer<typeof UserSchema>;// Kullanımfunction createUser(input: unknown): User {return UserSchema.parse(input); // Geçersizse ZodError fırlatır}
Zod şemalarınızı tek bir yerde tanımlayın ve hem API validasyonu hem de TypeScript tipleri için kullanın. Bu, "single source of truth" sağlar.
Express route'larında tip güvenliği:
import { Request, Response } from 'express';const CreateUserBody = z.object({email: z.string().email(),name: z.string().min(2),});app.post('/api/users', (req: Request, res: Response) => {const result = CreateUserBody.safeParse(req.body);if (!result.success) {return res.status(400).json({ errors: result.error.flatten() });}// result.data artık tam tipliconst user = await userService.create(result.data);return res.status(201).json(user);});
TypeScript + Zod entegrasyonu sonrası:
TypeScript tek başına yeterli değildir. Zod gibi runtime validasyon kütüphaneleri ile birleştirildiğinde, compile-time'dan runtime'a uzanan uçtan uca tip güvenliği sağlanır. Bu, büyüyen projelerde en değerli yatırımlardan biridir.