Learn
← Previous Next →

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