ToSnake<S>: S extends string ? S extends `${infer Head}${CapitalChars}${infer Tail}` ? Head extends "" ? Tail extends "" ? Lowercase<S> : S extends `${infer Caps}${Tail}` ? Caps extends CapitalChars ? Tail extends CapitalLetters ? `${Lowercase<Caps>}_${Lowercase<Tail>}` : Tail extends `${CapitalLetters}${string}` ? `${ToSnake<Caps>}_${ToSnake<Tail>}` : `${ToSnake<Caps>}${ToSnake<Tail>}` : never : never : Tail extends "" ? S extends `${Head}${infer Caps}` ? Caps extends CapitalChars ? Head extends Lowercase<Head> ? Caps extends Numbers ? never : `${ToSnake<Head>}_${ToSnake<Caps>}` : never : never : never : S extends `${Head}${infer Caps}${Tail}` ? Caps extends CapitalChars ? Head extends Lowercase<Head> ? Tail extends CapitalLetters ? `${ToSnake<Head>}_${ToSnake<Caps>}_${Lowercase<Tail>}` : Tail extends `${CapitalLetters}${string}` ? Head extends Numbers ? never : Head extends `${string}${Numbers}` ? never : `${Head}_${ToSnake<Caps>}_${ToSnake<Tail>}` : `${ToSnake<Head>}_${Lowercase<Caps>}${ToSnake<Tail>}` : never : never : never : S : never
Type Parameters
-
S extends string | number | symbol