export type CamelToSnakeCase = Str extends `${infer First}${infer Rest}` ? `${First extends Capitalize ? '_' : ''}${Lowercase}${CamelToSnakeCase}` : Str; type ArrayValuesToSnakeCase = Array>; type ObjectKeysToSnakeCase = { [Key in keyof Obj as CamelToSnakeCase]: NonNullable>; }; export type ValueToSnakeCase = Value extends Array ? ArrayValuesToSnakeCase : Value extends object ? ObjectKeysToSnakeCase : Value;