问题 #
实现一个 Camelize
的类型版本,用于递归转换蛇命名
type case1 = Camelize<{
some_prop: string
prop: { another_prop: string }
array: [{ snake_case: string }]
}>
// {
// someProp: string
// prop: { anotherProp: string }
// array: [{ snakeCase: string }]
// }
解答 #
type StringCamelize<T extends string> = T extends `${infer Head}_${infer Tail}` ? `${Head}${Capitalize<StringCamelize<Tail>>}` : T;
type ArrayCamelize<T extends unknown[]> = T extends [infer Head, ...infer Tail] ? [Camelize<Head>, ...ArrayCamelize<Tail>] : [];
type Camelize<T> = {
[K in keyof T as StringCamelize<K & string>]: T[K] extends Record<string, unknown> ? Camelize<T[K]> : T[K] extends unknown[] ? ArrayCamelize<T[K]> : T[K]
}
拆分 #
- 首先,实现
StringCamelize
用于转换蛇形命名的字符串 - 其次,实现
ArrayCamelize
用于递归转换 - 需要判断数组和对象然后递归转换