import {decode} from 'querystring'; export type QueryParser = (value?: string | string[]) => T; export type QueryParsers = {[K in keyof T]: QueryParser}; export const getQueryFromUrl = >(queryParsers: QueryParsers, search?: string) => { const query = decode((search || location.search).slice(1)); return Object.keys(queryParsers).reduce((memo, key) => { if (key in queryParsers) { const parser = queryParsers[key]; return { ...memo, [key]: parser?.(query[key]), }; } return memo; }, {} as T); };