我是一个打字新手,但我想创建一个Map类型,从另一个类型转换键。具体来说,假设我有一个类型,其中所有的键都是蛇形大小写,我如何创建一个类型,其中它们都是 Camel 大小写?
我想我可以做一些
type CamelCase<T> = {
[_.camelCase(P in keyof T)]: T[P];
}
type MyCamelCaseType = CamelCase<SnakeCaseType>;
但是TS不喜欢这样。如何转换现有类型的键以通过这种方式创建新类型?
我是一个打字新手,但我想创建一个Map类型,从另一个类型转换键。具体来说,假设我有一个类型,其中所有的键都是蛇形大小写,我如何创建一个类型,其中它们都是 Camel 大小写?
我想我可以做一些
type CamelCase<T> = {
[_.camelCase(P in keyof T)]: T[P];
}
type MyCamelCaseType = CamelCase<SnakeCaseType>;
但是TS不喜欢这样。如何转换现有类型的键以通过这种方式创建新类型?
5条答案
按热度按时间g6ll5ycj1#
在Typescript 4.1中,模板文字类型得到了相当大的升级。这是一个问题,我想解决了一段时间,并与一点调整设法想出这个:
我可以推荐阅读:https://dev.to/phenomnominal/i-need-to-learn-about-typescript-template-literal-types-51po,并尝试其中一些Typescript挑战https://github.com/type-challenges/type-challenges,以了解更多关于这些文字类型的信息。
yi0zb3m42#
如果你有一个嵌套数组的对象,你可以把它 Package 得更好。根据Max Eisenhardt的回答。
我们可以检查Array类型,如果是,则在现有功能中采用该Array的对象类型。
如果我们不这样做,数组函数将被标记为不可调用。
wr98u20j3#
而逆变换除了马克斯·艾森哈特的回答那些谁问:
j2datikz4#
基于Max Eisenhardt和Hespen的回答,我建议即使你已经在你的原始类型中有了snake case键,这个解决方案也会起作用。否则,您将进行下一次转换:
camelCase
->camelcase
wtlkbnrh5#
我在向ChatGPT展示了另外两个答案后问它,它给了我这个,也解决了我之前遇到的它不能处理数组的问题。我测试了它,它似乎在所有情况下都有效:
其解释:
The issue lies in the recursive part where you handle arrays in the KeysToCamelCase type. The current implementation doesn't properly handle arrays of objects. To address this, you need to differentiate between array types and non-array types in the recursive step.
虽然有点复杂。