Created
November 16, 2022 14:11
-
-
Save shov/ba9ade736df8ba7aa15674534f565747 to your computer and use it in GitHub Desktop.
TS snake case to camel case
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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