假设我们有某种具有驼峰命名法属性的对象类型:
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)
现在 TypeScript 有了模板文字类型,所以这实际上是可能的。
该type-fest包实现了几个这样的转换器,用于snake_case、kebab-case等camelCase。
这个特定的转换器与您想要的相反,但它是最简单的实现:
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)
| 归档时间: |
|
| 查看次数: |
1901 次 |
| 最近记录: |