TS递归为对象所有键添加blabla后缀时类型报错与嵌套处理问题
修复代码及说明
核心问题定位
- 类型报错2322:原函数泛型
T无约束,TS无法确认返回的数组/对象类型与输入T兼容 - 递归失效:原逻辑仅处理了顶层对象的键,未对属性值、数组项做递归调用
完整实现代码
// 递归添加键后缀的工具类型 type AddBlablaSuffix<T> = T extends Array<infer U> ? AddBlablaSuffix<U>[] : T extends object ? { [K in keyof T as `${string & K}blabla`]: AddBlablaSuffix<T[K]> } : T // 功能函数实现 function addBlabla<T extends object | any[]>(input: T): AddBlablaSuffix<T> { // 处理数组类型 if (Array.isArray(input)) { return input.map(item => addBlabla(item)) as AddBlablaSuffix<T> } // 处理普通对象类型 const result = {} as Record<string, any> for (const key in input) { if (Object.prototype.hasOwnProperty.call(input, key)) { const newKey = `${key}blabla` const value = input[key] // 递归处理值 result[newKey] = typeof value === 'object' && value !== null ? addBlabla(value as any) : value } } return result as AddBlablaSuffix<T> }
验证效果
输入addBlabla([{ a: [{ b: 1 }] }])时,输出类型及运行结果完全符合预期:
// 输出类型 { ablabla: { bblabla: number; }[]; }[]
内容的提问来源于stack exchange,提问作者Altaula
相关产品推荐
相关产品推荐

