Skip to content

Instantly share code, notes, and snippets.

@moreal
Created July 5, 2021 23:51
Show Gist options
  • Save moreal/e8807dbda16bfe3ee4f7df5ec3f0025b to your computer and use it in GitHub Desktop.
Save moreal/e8807dbda16bfe3ee4f7df5ec3f0025b to your computer and use it in GitHub Desktop.
Simple TypeScript Template Literal Type usage for SQL query
type Split<S extends string, D extends string> = S extends `${infer T}${D}${infer U}` ? [T, ...Split<U, D>] : [S];
type Strip<S extends string> =
S extends ` ${infer T}`
? Strip<T>
: S extends `${infer U} `
? Strip<U>
: S;
type MapStrip<A extends string[]> =
A extends []
? A
: A extends [string]
? [Strip<A[0]>]
: A extends [string, ...infer R]
? [Strip<A[0]>, ...MapStrip<R>]
: never;
type AsObject<A extends string[]> =
A extends []
? {}
: A extends [string]
? { [T in A[0]]: object }
: A extends [string, ...infer R]
? { [T in A[0]]: object } & AsObject<R>
: {}
type QueryResult<T extends string> = T extends `SELECT ${infer R} FROM` ? AsObject<MapStrip<Split<R, ",">>> : never;
declare function fetch<T extends string>(query: T): QueryResult<T>;
fetch("SELECT book_name, book_number FROM").book_name
fetch("SELECT book_name, book_number FROM").book_number
fetch("SELECT book_name, book_number FROM").book_numbera
fetch("SELECT book_name, book_number FROM").unknown_field
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment