【问题标题】:Typescript generic to turn underscore object to camel case打字稿通用将下划线对象转换为驼峰式大小写
【发布时间】:2020-01-08 10:42:34
【问题描述】:

假设我有一个这样的界面

interface Example {
    first_name: string,
    last_name: string,
    home_town: string,
}

我正在寻找像 Camelize 这样的泛型,它可以采用 Example 并将所有键切换为有效,如果它们是骆驼而不是下划线。

const e: Camelize<Example> = {
  firstName: 'string',
  lastName: 'string',
  homeTown: 'string'
}

这可能吗?

【问题讨论】:

标签: typescript


【解决方案1】:

TypeScript 4.5 更新:

随着tail recursion elimination on conditional types 的引入,现在可以编写Camelize 的版本,将键转换为驼峰式大小写,而不会像以前那样容易遇到递归深度限制:

CamelizeString&lt;T, C&gt; 类型使用C 作为累加器来存储将T 中的snake case 字符串转换为C 中的camel case 字符串的中间结果。

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

其余代码与以下版本相同。

Playground link to code


TypeScript 4.1 引入了template literal typeskey remapping in mapped types(见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'
}

CamelizeString&lt;T&gt; 的实现在字符串 T 中找到第一个下划线字符 ("_"),将其删除,并在对剩余部分递归调用 CamelizeString 后将字符串的剩余部分大写。并且Camelize&lt;T&gt;T 的每个键K 重新映射到CamelizeString&lt;K&gt;

Playground link to code

【讨论】:

    【解决方案2】:

    FWIW,我遇到了some issues 的类型来自@jcalz 的答案。我发现 CamelCasedPropertiesSnakeCasedPropertieshttps://github.com/sindresorhus/type-fest 到目前为止工作良好。

    【讨论】:

      猜你喜欢
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 2010-12-03
      • 1970-01-01
      • 2011-02-27
      • 2016-07-30
      相关资源
      最近更新 更多