Skip to content

Instantly share code, notes, and snippets.

@effe-megna
Created March 2, 2020 17:13
Show Gist options
  • Select an option

  • Save effe-megna/b6b0a48c5b704ff82d28b7a5a1e74aa1 to your computer and use it in GitHub Desktop.

Select an option

Save effe-megna/b6b0a48c5b704ff82d28b7a5a1e74aa1 to your computer and use it in GitHub Desktop.
SQL QueryBuilder type-safe, tiny poc
interface QbWithSelection <T extends Record<string, any> = never, Return = T> {
where: (condition: Partial<T>) => QueryBuilder<T, Return>
join: <NT extends Record<string, any>>(tableName: string) => QueryBuilder<T & NT, Return>
limit: (n: number) => QueryBuilder<T, Return>
offset: (n: number) => QueryBuilder<T, Return>
orderBy: <K extends keyof T>(columns: Array<K>, by: "ASC" | "DESC") => QueryBuilder<T, Return>
getQuery: () => string
run: () => Return
}
interface QueryBuilder <T extends Record<string, any> = never, Return = T> {
readonly _R: Return
select: <K extends keyof T>(columns: Array<K>, from: string) => QbWithSelection<T, Pick<T, K>>
selectAll: (from: string) => QbWithSelection<T, T>
}
declare const qb: QueryBuilder<{ id: string, name: string, age: number } & { vehicleName: string }>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment