打字稿通用将下划线对象转换为驼峰式大小写

Tho*_*ggi 2 typescript

假设我有一个这样的界面

interface Example {
    first_name: string,
    last_name: string,
    home_town: string,
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种通用的方法CamelizeExample如果它们被骆驼化而不是下划线,则可以将所有密钥转换为有效。

const e: Camelize<Example> = {
  firstName: 'string',
  lastName: 'string',
  homeTown: 'string'
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?

jca*_*alz 11

TypeScript 4.1 将在映射类型中引入模板文字类型和键扩充(请参阅microsoft/TypeScript#40336),此时您可以通过以下方式实现:

type CamelizeString<T extends PropertyKey> = 
    T extends string ? string extends T ? string :
    T extends `${infer F}_${infer R}` ? `${F}${Capitalize<CamelizeString<R>>}` : T : T;

type Camelize<T> = { [K in keyof T as CamelizeString<K>]: T[K] }

type CamelizeExample = Camelize<Example>;
/* type CamelizeExample = {
    firstName: string;
    lastName: string;
    homeTown: string;
} */

const e: Camelize<Example> = {
    firstName: 'string',
    lastName: 'string',
    homeTown: 'string'
}
Run Code Online (Sandbox Code Playgroud)

Playground 链接到代码


Jul*_*era 5

FWIW,我遇到了@jcalz 答案中类型的一些问题。我发现CamelCasedPropertieshttps://github.com/sindresorhus/type-festSnakeCasedProperties到目前为止工作良好。