Learn
← Previous Next →

Hari 20: Type-Safe Builder Pattern

60 min Last updated 09 Apr 2026

Builder Pattern dengan TypeScript

type BuildState = Record;

class QueryBuilder<
    T extends string,
    Set extends Partial> = {}
> {
    private config: Record = {};

    select(fields: string[]): QueryBuilder> {
        this.config.select = fields;
        return this as any;
    }

    from(table: string): QueryBuilder> {
        this.config.from = table;
        return this as any;
    }

    where(condition: string): QueryBuilder {
        this.config.where = condition;
        return this;
    }

    // build hanya tersedia jika select & from sudah di-set
    build(this: QueryBuilder>): string {
        const { select, from, where } = this.config;
        let q = `SELECT ${select.join(", ")} FROM ${from}`;
        if (where) q += ` WHERE ${where}`;
        return q;
    }
}

const query = new QueryBuilder()
    .from("users")
    .select(["id", "nama", "email"])
    .where("aktif = true")
    .build();

console.log(query);

💡 Notice: Builder pattern cocok untuk objek dengan banyak konfigurasi opsional. Method chaining (return this) memungkinkan sintaks yang fluent.

Assignment

Implementasikan EmailBuilder dengan metode to(), subject(), body(), cc?() yang type-safe. build() hanya bisa dipanggil jika to, subject, dan body sudah di-set.

Expected output:

To: budi@example.com
Subject: Halo Budi!
CC: admin@example.com
Selamat datang di TypeScript!
TS index.ts
Solution
Output