Skip to content

Instantly share code, notes, and snippets.

@andantonyan
Created August 31, 2022 11:13
Show Gist options
  • Save andantonyan/fdee525cf3bb22fff366d1e1f66eff8e to your computer and use it in GitHub Desktop.
Save andantonyan/fdee525cf3bb22fff366d1e1f66eff8e to your computer and use it in GitHub Desktop.
Generate pagination `sort` field type from SortField and SortOrder
enum SortOrder {
ASC,
DESC,
}
enum UsersSortField {
ID,
NAME,
CREATION_DATE,
}
type Sort<T extends string, U extends string, P extends string = T> = T extends unknown
? `${T}:${U}` | `${T}:${U},${Sort<Exclude<P, T>, U>}`
: never;
interface Pagination<T extends string, U extends string> {
readonly page?: number;
readonly size?: number;
readonly sort?: Sort<T, U>;
}
type UsersPagination = Pagination<keyof typeof UsersSortField, keyof typeof SortOrder>;
function main(): void {
const pagination: UsersPagination = {
size: 10,
page: 1,
// sort: "CREATION_DATE:ASC" // valid
// sort: "CREATION_DATE:ASC,NAME:ASC" // valid
// sort: "CREATION_DATE:ASC," // invalid
// sort: "CREATION_DATE:ASC,CREATION_DATE:DESC" // invalid
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment