TypeScript 将camelCase 键转换为snake_case

Kev*_*Pei 5 typescript

假设我们有某种具有驼峰命名法属性的对象类型:

type Foo = {
  propertyBob: string;
  propertyJane?: number;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法创建一个将camelCase转换为snake_case的泛型?例如

type foo_snake = Snakeify<Foo>; 
/*
{
  property_bob: string;
  property_jane?: number;
}
*/
Run Code Online (Sandbox Code Playgroud)

dec*_*ory 1

现在 TypeScript 有了模板文字类型,所以这实际上是可能的。

type-fest包实现了几个这样的转换器,用于snake_casekebab-casecamelCase

这个特定的转换器与您想要的相反,但它是最简单的实现:

type SnakeCaseToPascalCase<S extends string> =
    S extends `${infer A}_${infer B}`
    ? `${Capitalize<A>}${SnakeCaseToPascalCase<B>}`
    : Capitalize<S>

const snakeToPascal =
    <S extends string>(s: S): SnakeCaseToPascalCase<S> =>
        s.split('_')
         .map(word => word[0].toUpperCase() + word.slice(1))
         .join("") as any

const pascalCase = snakeToPascal("get_abstract_singleton_manager")
// pascalCase: "GetAbstractSingletonManager"
Run Code Online (Sandbox Code Playgroud)

然后您可以将此转换器与映射类型一起使用:

type SnakeToPascal<M extends Record<string, any>> =
    {[K in keyof M as SnakeCaseToPascalCase<K & string>]: M[K]}

type User = SnakeToPascal<{
    first_name: string,
    last_name: string,
}>
// inferred as: {
//    FirstName: string;
//    LastName: string;
// }
Run Code Online (Sandbox Code Playgroud)