Hari 21: Zod-like Runtime Validation
65 min
Last updated 09 Apr 2026
Runtime Validation yang Type-Safe
// Zod-like validator (simplified)
type Schema = {
parse: (input: unknown) => T;
safeParse: (input: unknown) => { success: true; data: T } | { success: false; error: string };
};
const string = (): Schema => ({
parse: (v) => {
if (typeof v !== "string") throw new Error(`Expected string, got ${typeof v}`);
return v;
},
safeParse: (v) => {
try { return { success: true, data: string().parse(v) }; }
catch (e) { return { success: false, error: (e as Error).message }; }
}
});
const number = (): Schema => ({
parse: (v) => {
if (typeof v !== "number") throw new Error(`Expected number, got ${typeof v}`);
return v;
},
safeParse: (v) => {
try { return { success: true, data: number().parse(v) }; }
catch (e) { return { success: false, error: (e as Error).message }; }
}
});
💡
Notice: Validator menggunakan chain of responsibility: setiap .min() / .minLength() menambah validator ke array. parse() menjalankan semua validasi berurutan.
Assignment
Buat mini-validator: v.string().minLength(3), v.number().min(0).max(100), v.object({}) dengan field validasi. Validate data user.
Expected output:
✓ Budi: 85
✗ Al: Min 3 karakter
TS
index.ts
Solution
Output