Skip to content

Instantly share code, notes, and snippets.

@slauzinho
Created July 22, 2022 11:37
Show Gist options
  • Save slauzinho/57691eb847f922da8619aef2387aa88f to your computer and use it in GitHub Desktop.
Save slauzinho/57691eb847f922da8619aef2387aa88f to your computer and use it in GitHub Desktop.
export type ToCamelCase<S extends string> =
S extends `${infer Head}_${infer Tail}`
? `${Head}${Capitalize<ToCamelCase<Tail>>}`
: S;
export type ObjectToCamel<T> = T extends readonly unknown[]
? { [K in keyof T]: ObjectToCamel<T[K]> }
: T extends object
? {
[K in keyof T as ToCamelCase<Extract<K, string>>]: ObjectToCamel<T[K]>;
}
: T;
type StringNumber = '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '0';
export type ToSnakeCase<S extends string> = S extends `${infer T}${infer U}`
? `${T extends Exclude<Capitalize<T>, StringNumber>
? '_'
: ''}${Lowercase<T>}${ToSnakeCase<U>}`
: S;
export type ObjectToSnake<T> = T extends readonly unknown[]
? { [K in keyof T]: ObjectToSnake<T[K]> }
: T extends object
? {
[K in keyof T as ToSnakeCase<Extract<K, string>>]: ObjectToSnake<T[K]>;
}
: T;
interface ApiResponseSuccess<T> {
data: ObjectToCamel<T>;
error: null;
}
interface ApiResponseError {
data: null;
error: { message: string };
}
export type ApiResponse<T> = Promise<ApiResponseSuccess<T> | ApiResponseError>;
export function notEmpty<TValue>(
value: TValue | null | undefined
): value is TValue {
if (value === null || value === undefined) return false;
return true;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment