typescript - Typescript如何将类型键映射到camelCase
问题描述
我是打字稿的新手,但我想创建一个映射类型,将键从另一种类型转换。具体来说,假设我有一个所有键都是蛇形的类型,我如何创建一个它们都是骆驼形的类型?
我以为我可以做类似的事情
type CamelCase<T> = {
[_.camelCase(P in keyof T)]: T[P];
}
type MyCamelCaseType = CamelCase<SnakeCaseType>;
但是TS不喜欢这样。如何以这种方式转换现有类型的键以创建新类型?
解决方案
在 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以了解有关这些文字类型的更多信息。
推荐阅读
- sap-cloud-sdk - 租户特定的弹性配置
- android - 主要要求是将 react-native-android 构建转换为 .aar(Android Archive) 库以在 Cordova 中重用
- autosar - 如何在 Vector AUTOSAR 配置工具中为 OS_Task 配置 MPU(内存保护单元)?
- ios - 如何在父视图中将项目添加到全局列表 var initted/wrapped 在 ObservableObject 中并让它在子视图中反映在 SwiftUI 中的 ForEach 中?
- django - 值错误:字段 'id' 需要一个数字,但得到了 'favicon.ico
- javascript - 为什么动画不适用于所有类元素?
- python - 让我的 Discord 机器人响应某个人
- flutter - 任务':audioplayers:compileDebugKotlin'的Flutter执行失败
- mysql - 求和类似值 MySQL 后每种类型的最大值
- reactjs - 在 React 中触发 bootstrap 5 模态确认