logoProsperBao

Camelize

2022-05-10 12

题目来源(type-challenges)

问题

实现一个 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 用于递归转换
  • 需要判断数组和对象然后递归转换