Skip to content

Instantly share code, notes, and snippets.

@shov
Created November 16, 2022 14:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shov/ba9ade736df8ba7aa15674534f565747 to your computer and use it in GitHub Desktop.
Save shov/ba9ade736df8ba7aa15674534f565747 to your computer and use it in GitHub Desktop.
TS snake case to camel case
// Original author is ford04 (https://stackoverflow.com/users/5669456/ford04)
// Original answer on stack overflow (https://stackoverflow.com/questions/60269936/typescript-convert-generic-object-from-snake-to-camel-case)
type SnakeToCamelCase<S extends string> =
S extends `${infer T}_${infer U}` ?
`${T}${Capitalize<SnakeToCamelCase<U>>}` :
S
type CamelToSnakeCase<S extends string> =
S extends `${infer T}${infer U}` ?
`${T extends Capitalize<T> ? "_" : ""}${Lowercase<T>}${CamelToSnakeCase<U>}` :
S
type CamelToPascalCase<S extends string> = Capitalize<S>
type PascalToCamelCase<S extends string> = Uncapitalize<S>
type PascalToSnakeCase<S extends string> = CamelToSnakeCase<Uncapitalize<S>>
type SnakeToPascalCase<S extends string> = Capitalize<SnakeToCamelCase<S>>
type T11 = SnakeToCamelCase<"hello"> // "hello"
type T12 = SnakeToCamelCase<"hello_world"> // "helloWorld"
type T13 = SnakeToCamelCase<"hello_ts_world"> // "helloTsWorld"
type T14 = SnakeToCamelCase<"hello_world" | "foo_bar"> // "helloWorld" | "fooBar"
type T15 = SnakeToCamelCase<string> // string
type N = 42
type T16 = SnakeToCamelCase<`the_answer_is_${N}`> // "theAnswerIs42" (type N = 42)
type T21 = CamelToSnakeCase<"hello"> // "hello"
type T22 = CamelToSnakeCase<"helloWorld"> // "hello_world"
type T23 = CamelToSnakeCase<"helloTsWorld"> // "hello_ts_world"
type T31 = CamelToPascalCase<"hello">
type T32 = CamelToPascalCase<"helloWorld">
type T33 = CamelToPascalCase<"helloTsWorld">
type T41 = SnakeToPascalCase<"hello">
type T42 = SnakeToPascalCase<"hello_world">
type T43 = SnakeToPascalCase<"hello_ts_world">
type T51 = PascalToCamelCase<"Hello">
type T52 = PascalToCamelCase<"HelloWorld">
type T53 = PascalToCamelCase<"HelloTsWorld">
type T61 = PascalToSnakeCase<"Hello">
type T62 = PascalToSnakeCase<"HelloWorld">
type T63 = PascalToSnakeCase<"HelloTsWorld">
type InputType = {
snake_case_key_1: number,
snake_case_key_2: string,
}
type OutputType = { [K in keyof InputType as SnakeToCamelCase<K>]: InputType[K] }
/*
type OutputType = {
snakeCaseKey1: number;
snakeCaseKey2: string;
}
*/
/**
*
* Extension: Convert nested properties
*
*/
type InputTypeNested = {
snake_case_key_1: {
snake_case_key_11: string
snake_case_key_12: string
},
snake_case_key_2: string,
}
type SnakeToCamelCaseNested<T> = T extends object ? {
[K in keyof T as SnakeToCamelCase<K & string>]: SnakeToCamelCaseNested<T[K]>
} : T
type OutputTypeNested = SnakeToCamelCaseNested<InputTypeNested>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment