首页 > 解决方案 > Typescript如何将类型键映射到camelCase

问题描述

我是打字稿的新手,但我想创建一个映射类型,将键从另一种类型转换。具体来说,假设我有一个所有键都是蛇形的类型,我如何创建一个它们都是骆驼形的类型?

我以为我可以做类似的事情

type CamelCase<T> = {
  [_.camelCase(P in keyof T)]: T[P];
}

type MyCamelCaseType = CamelCase<SnakeCaseType>;

但是TS不喜欢这样。如何以这种方式转换现有类型的键以创建新类型?

标签: typescript

解决方案


在 Typescript 4.1 中,模板文字类型得到了相当大的升级。这是一个我想解决一段时间的问题,并通过一些调整设法解决了这个问题:

type CamelCase<S extends string> = S extends `${infer P1}_${infer P2}${infer P3}`
  ? `${Lowercase<P1>}${Uppercase<P2>}${CamelCase<P3>}`
  : Lowercase<S>

type KeysToCamelCase<T> = {
    [K in keyof T as CamelCase<string &K>]: T[K] extends {} ? KeysToCamelCase<T[K]> : T[K]
}


interface SnakeCase {
    bar_value: string;
    baz_value: {
        blah_test: number;
    }
}

const transformed: KeysToCamelCase<SnakeCase> = {
    bazValue: {
        blahTest: 2
    },
    barValue: 'test'
}

我可以推荐阅读:https : //dev.to/phenomnominal/i-need-to-learn-about-typescript-template-literal-types-51po 并尝试其中一些 Typescript 挑战https://github.com/ type-challenges/type-challenges以了解有关这些文字类型的更多信息。


推荐阅读