Tür Güvenli Formlar ve API Yanıt Sözleşmeleri
Şemalardan TypeScript türlerini çıkarmak ve hem form verilerini hem de API yanıtlarını doğrulamak için Zod kullanın.
Tür Güvenli Formlar ve API Yanıt Sözleşmeleri, CoddyKit'te ücretsiz bir React Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, React Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. React Academy kursu toplamda 4 dersten oluşur.
Tür Güvenli Veri Biçimleri Neden Önemlidir?
Formlar ve API yanıtları, verilerin güvenilmeyen kaynaklardan uygulamanıza girdiği sınırlardır. Zod, hem çalışma zamanında doğrulama yapan hem de TypeScript türleri çıkaran şemalar tanımlamanızı sağlar.
Zod Şemalarının Temelleri
Zod'un akıcı API'siyle şemalar tanımlayın. TypeScript türünü çıkarmak için z.infer<typeof schema> kullanın.
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' }Zod Çözücüsüyle React Hook Form
Tür güvenli form doğrulaması için Zod şemalarını React Hook Form ile bütünleştirin — TypeScript, form verilerinin ve hataların biçimini bilir.
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 Yanıtlarını Doğrulama
Sınırda biçim uyuşmazlıklarını yakalamak için API yanıtlarını Zod ile ayrıştırın — API beklenmeyen veriler döndürürse bileşeninizin derinliklerinde bir çalışma zamanı çökmesi yerine ayrıntılı bir hata alırsınız.
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
}Sorunsuz Hatalar için Güvenli Ayrıştırma
Hata fırlatmak yerine sonuç nesnesi almak için schema.safeParse() kullanın — bu, hataları kullanıcıya göstermek istediğiniz form doğrulaması için idealdir.
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 typedZod ile Ayrımlı Birleşimler
Başarı/hata bayrağına göre farklı yapılara sahip API yanıtlarını modellemek için z.discriminatedUnion kullanın.
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 Dönüşümleri
Ayrıştırma sırasında verileri uygun türe dönüştürmek veya yeniden yapılandırmak için .transform() kullanın; örneğin bir tarih dizesini Date nesnesine dönüştürebilirsiniz.
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 }Şemaları Yeniden Kullanma
Yinelenen tanımları önlemek için oluşturma ve güncelleme şemalarını temel şemadan türetin.
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>;Zod ile Sunucu Eylemi
Veritabanına erişmeden önce bir Next.js Sunucu Eyleminde form verilerini Zod ile doğrulayın.
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');
}Ön Uç ve Arka Uç Arasında Paylaşılan Şemalar
Zod şemalarını paylaşılan bir paketten dışa aktarın; böylece ön uç ve arka uç aynı doğrulama mantığını kullanır ve tek bir şema gerçeğin tek kaynağı olur.
// 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 Hata Mesajları
Daha iyi bir kullanıcı deneyimi için her alana özel hata mesajları belirleyin; Zod bunları çözümleyici aracılığıyla formun hata gösterimine otomatik olarak iletir.
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'),
});Hızlı Kontrol
z.infer
Özet
Zod şemalarını bir kez tanımlayın ve TypeScript türlerini türetmek için z.infer kullanın. Tür güvenli doğrulama için React Hook Form içinde zodResolver kullanın. API yanıtlarını sınırda Zod ile ayrıştırın, kullanıcıya gösterilecek hatalar için safeParse kullanın ve şemaları paylaşılan bir paket aracılığıyla ön uç ile arka uç arasında paylaşın.
Sıkça Sorulan Sorular
“Tür Güvenli Formlar ve API Yanıt Sözleşmeleri” dersi ücretsiz mi?
Evet — “Tür Güvenli Formlar ve API Yanıt Sözleşmeleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve React Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. React Academy kursu toplamda 4 dersten oluşur.
“Tür Güvenli Formlar ve API Yanıt Sözleşmeleri” dersinde ne öğreneceğim?
Şemalardan TypeScript türlerini çıkarmak ve hem form verilerini hem de API yanıtlarını doğrulamak için Zod kullanın. React Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
React Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te React Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Tür Güvenli Formlar ve API Yanıt Sözleşmeleri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu React Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her React Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Bileşen Varyantları için Ayırt Edici Birleşimler
- React'te Koşullu ve Eşlenmiş Türler
- 'as' Prop'lu Polimorfik Bileşenler
- Tür Güvenli Formlar ve API Yanıt Sözleşmeleri