Skip to content

Instantly share code, notes, and snippets.

@ortense
Created November 1, 2021 18:14
Show Gist options
  • Save ortense/8e8a8b1bf483809f150e87640b772917 to your computer and use it in GitHub Desktop.
Save ortense/8e8a8b1bf483809f150e87640b772917 to your computer and use it in GitHub Desktop.
Generic objet builder in typescript
export type Builder<T> = {
build(): Partial<T>;
append<K extends keyof T>(key: K, value: T[K]): Builder<T>;
};
export function createBuilder<T>(): Builder<T> {
const obj: Partial<T> = {};
const builder: Builder<T> = {
build: () => ({ ...obj }),
append(key, value) {
obj[key] = value;
return builder;
},
};
return builder;
}
import { createBuilder } from "./builder.ts";
type Pokemon = {
name: string;
number: number;
type: string; // lazy to write a enum
level: number;
};
const umbreon = createBuilder<Pokemon>()
.append("name", "Umbreon")
.append("type", "dark")
.append("number", 197)
.append("level", 100)
.build();
console.log(umbreon);
// { name: "Umbreon", type: "dark", number: 197, level: 100 }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment