Formulir Aman Tipe & Kontrak Respons API
Gunakan Zod untuk menyimpulkan tipe TypeScript dari skema dan memvalidasi data formulir serta respons API.
Formulir Aman Tipe & Kontrak Respons API adalah pelajaran React Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar React Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus React Academy mencakup 4 pelajaran total.
Mengapa Bentuk Data Aman Tipe Itu Penting
Formulir dan respons API adalah batas tempat data dari sumber yang tidak tepercaya masuk ke aplikasi Anda. Zod memungkinkan Anda menentukan skema yang memvalidasi saat runtime sekaligus menyimpulkan tipe TypeScript.
Dasar-Dasar Skema Zod
Tentukan skema dengan API berantai Zod. Gunakan z.infer<typeof schema> untuk mengekstrak tipe TypeScript.
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 dengan Penyelesai Zod
Integrasikan skema Zod dengan React Hook Form untuk validasi formulir yang aman terhadap tipe — TypeScript mengetahui bentuk data dan kesalahan formulir.
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
};
}Memvalidasi Respons API
Uraikan respons API dengan Zod untuk mendeteksi ketidaksesuaian bentuk pada batas masuknya data — jika API mengembalikan data yang tidak terduga, Anda mendapatkan kesalahan terperinci, bukan kerusakan saat runtime jauh di dalam komponen.
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
}Penguraian Aman untuk Kesalahan yang Terkelola
Gunakan schema.safeParse() untuk mendapatkan objek hasil alih-alih melemparkan kesalahan — ideal untuk validasi formulir ketika Anda ingin menampilkan kesalahan kepada pengguna.
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 typedUnion Diskriminatif dengan Zod
Gunakan z.discriminatedUnion untuk memodelkan respons API yang memiliki bentuk berbeda berdasarkan penanda berhasil/gagal.
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 }Transformasi Zod
Gunakan .transform() untuk mengonversi atau mengubah bentuk data selama penguraian—misalnya, mengubah string tanggal menjadi objek Date.
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 }Menggunakan Kembali Skema
Turunkan skema pembuatan dan pembaruan dari skema dasar untuk menghindari duplikasi.
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>;Aksi Server dengan Zod
Validasi data formulir dalam Server Action Next.js dengan Zod sebelum mengakses basis data.
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');
}Skema Bersama antara Frontend dan Backend
Ekspor skema Zod dari paket bersama agar frontend dan backend menggunakan logika validasi yang sama—satu skema sebagai satu-satunya sumber kebenaran.
// 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';Pesan Kesalahan Zod
Sesuaikan pesan kesalahan untuk setiap bidang agar pengalaman pengguna lebih baik—Zod secara otomatis meneruskannya ke tampilan kesalahan formulir melalui resolver.
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'),
});Pemeriksaan Cepat
Apa yang disediakan oleh z.infer
Ringkasan
Definisikan skema Zod sekali, lalu gunakan z.infer untuk menurunkan tipe TypeScript. Gunakan zodResolver dalam React Hook Form untuk validasi yang aman terhadap tipe. Uraikan respons API dengan Zod di batas sistem, gunakan safeParse untuk menampilkan kesalahan kepada pengguna, dan bagikan skema antara frontend dan backend melalui paket bersama.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Formulir Aman Tipe & Kontrak Respons API” gratis?
Ya — teks lengkap “Formulir Aman Tipe & Kontrak Respons API” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus React Academy, upgrade ke CoddyKit PRO. Kursus React Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Formulir Aman Tipe & Kontrak Respons API”?
Gunakan Zod untuk menyimpulkan tipe TypeScript dari skema dan memvalidasi data formulir serta respons API. Kamu berlatih React Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai React Academy?
Tidak diperlukan pengalaman sebelumnya. React Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Formulir Aman Tipe & Kontrak Respons API” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran React Academy ini?
Ya. Setiap pelajaran React Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Union Diskriminatif untuk Varian Komponen
- Tipe Kondisional & Terpetakan dalam React
- Komponen Polimorfik dengan Prop 'as'
- Formulir Aman Tipe & Kontrak Respons API