You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:54:03