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