10LOC

#builder-pattern

TypeScriptadvanced

A fluent builder pattern typed with generics

export class QueryBuilder<Shape extends Record<string, unknown> = Record<string, never>> {
  private constructor(private readonly clauses: Shape) {}

  static create(): QueryBuilder<Record<string, never>> {
    return new QueryBuilder({});

Make each .where() call widen the builder's tracked return type by exactly the key and value just added, so build() is never underspecified.