rivo
Version:
🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.
28 lines (24 loc) • 1.08 kB
TypeScript
import type { Args, Fn } from "../HKT";
import type { List } from "../List";
import type { ToCamelCase } from "../Str/ToCamelCase";
type _CamelizeMutableList<TS extends List> =
TS extends [infer Head, ...infer Tail] ?
[Head extends object ? Camelize<Head> : Head, ..._CamelizeMutableList<Tail>]
: [];
type _CamelizeImmutableList<TS extends List> =
TS extends readonly [infer Head, ...infer Tail] ?
readonly [Head extends object ? Camelize<Head> : Head, ..._CamelizeImmutableList<Tail>]
: readonly [];
export type Camelize<O extends object> =
O extends Array<infer U> ?
number extends O["length"] ?
Array<U extends object ? Camelize<U> : U>
: _CamelizeMutableList<O>
: O extends ReadonlyArray<infer U> ?
number extends O["length"] ?
ReadonlyArray<U extends object ? Camelize<U> : U>
: _CamelizeImmutableList<O>
: { [K in keyof O & string as ToCamelCase<K>]: [O[K]] extends [object] ? Camelize<O[K]> : O[K] };
export default interface CamelizeFn extends Fn<[object], object> {
def: ([o]: Args<this>) => Camelize<typeof o>;
}