我试图通过将输入对象的键从camel大小写映射到snake大小写来输出一个新对象。
TypeScript 4.6.0在条件类型上具有尾部递归消除
转换似乎可以
type CamelToSnake<T extends string, P extends string = ''> = string extends T
? string
: T extends `${infer C0}${infer R}`
? CamelToSnake<R, `${P}${C0 extends Lowercase<C0> ? '' : '_'}${Lowercase<C0>}`>
: P
type CamelKeysToSnake<T> = {
[K in keyof T as CamelToSnake<Extract<K, string>>]: T[K]
}
type TInput = {
defaultVisible: boolean
defaultSize: number
}
type TOutput = CamelKeysToSnake<TInput>
function toSnakeCase(str: string) {
var temp = str.replace(/[A-Z]/g, function (match) {
return "_" + match.toLowerCase();
});
if(temp.slice(0,1) === '_'){
temp = temp.slice(1);
}
return temp;
};
function test(input: Partial<TInput>){
const output: Partial<TOutput>={}
for (const [key, value] of Object.entries(input)) {
const snakeKey = toSnakeCase(key) as keyof TOutput
if (value !== undefined) output[snakeKey] = value
}
}
但在代码行中
if (value !== undefined) output[snakeKey] = value
出现意外错误
Type 'number | boolean' is not assignable to type 'undefined'.
Type 'number' is not assignable to type 'undefined'.(2322)
为什么会发生这种事?我该怎么修?
**仅解决**
我认为发生这种情况是因为属性snakeKey
有一个未定义的相关类型
我不知道如何修复属性类型,但你可以使用来解决这个问题
if (value !== undefined) Object.defineProperty(output, snakeKey, { value })