TypeScript merge函数泛型在map仅1个属性时keyof推导错误如何解决
问题根因
当map仅存在1个属性时,联合类型Keys只有唯一可选值,TypeScript会自动将未显式传参的可选泛型B推导为这个唯一key,导致返回值类型误判为已经合并了该key对应的对象类型。
修复方案
核心逻辑是给泛型添加默认值阻断错误的自动推导,同时用条件类型明确区分传参/未传参场景的返回值类型:
const data = { end: 'World' } const map = { data } export type Map = typeof map; export type Keys = keyof Map; // 给泛型B设置默认值never,避免未传参时自动推导为唯一key function merge<A, B extends Keys = never>(input: { obj: A; append?: B; }) { const append = input.append ? map[input.append] : {}; // 用条件类型明确返回值规则:传了append则合并对应类型,否则只返回原对象类型 return { ...input.obj, ...append } as B extends Keys ? A & Map[B] : A; }
效果验证
const initial = { start: 'Hello' } // 传append参数的场景 const a = merge({ obj: initial, append: 'data' }); console.log(a.end); // 类型正常识别,无报错 // 未传append参数的场景 const b = merge({ obj: initial }); console.log(b.end); // 正常抛出属性不存在的类型错误,符合预期
该方案兼容map存在任意数量属性的场景,不会再出现单属性时的类型误判问题。
内容的提问来源于stack exchange,提问作者LoveDev
相关产品推荐
相关产品推荐

