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 { ToSnakeCase } from "../Str/ToSnakeCase";
type _SnakeizeMutableList<TS extends List> =
TS extends [infer Head, ...infer Tail] ?
[Head extends object ? Snakeize<Head> : Head, ..._SnakeizeMutableList<Tail>]
: [];
type _SnakeizeImmutableList<TS extends List> =
TS extends readonly [infer Head, ...infer Tail] ?
readonly [Head extends object ? Snakeize<Head> : Head, ..._SnakeizeImmutableList<Tail>]
: readonly [];
export type Snakeize<O extends object> =
O extends Array<infer U> ?
number extends O["length"] ?
Array<U extends object ? Snakeize<U> : U>
: _SnakeizeMutableList<O>
: O extends ReadonlyArray<infer U> ?
number extends O["length"] ?
ReadonlyArray<U extends object ? Snakeize<U> : U>
: _SnakeizeImmutableList<O>
: { [K in keyof O & string as ToSnakeCase<K>]: [O[K]] extends [object] ? Snakeize<O[K]> : O[K] };
export default interface SnakeizeFn extends Fn<[object], object> {
def: ([o]: Args<this>) => Snakeize<typeof o>;
}