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

TypeScript新增对象属性后动态属性类型推断失效问题

问题原因

单顶层属性时类型推断正常,本质是keyof typeof Actions此时是单一字面量类型,不存在类型分发问题。当存在多个顶层属性时,Param类型是所有键的联合类型,fn函数内部没有对入参做泛型窄化,TypeScript 无法将联合类型的入参和mapper的泛型参数K做精准绑定,只能将返回值推断为所有属性值的联合类型。

修复方案

给fn函数增加泛型约束,在函数调用时将入参窄化为具体的键字面量类型,即可触发正确的类型推断。

修复后完整代码:

const Actions = {
    globalUI: {
        openModal: 'openModal'
    },
    LP: {
        addDirectory: 'addDirectory'
    }
}

type Mapper = <T, K extends keyof T>(action: T, key: K) => T[K];
const mapper: Mapper = (action, name) => {
    return action[name]
}

// 定义Actions的类型,给fn增加泛型K,约束为Actions的合法键
type ActionsType = typeof Actions;
const fn = <K extends keyof ActionsType>(param: K) => {
    const action = mapper(Actions, param);
    return action
}

// 调用时类型会被精准推断
const globalUIAction = fn('globalUI'); // 类型:{ openModal: string }
const lpAction = fn('LP'); // 类型:{ addDirectory: string }

可选优化

如果需要让属性值的类型也收窄为字面量而非宽泛的string,可以给Actions添加as const断言:

const Actions = {
    globalUI: {
        openModal: 'openModal'
    },
    LP: {
        addDirectory: 'addDirectory'
    }
} as const;

添加后fn('globalUI')返回的类型中,openModal的类型会被推断为字面量'openModal',更适合常量 action 映射的使用场景。

内容的提问来源于stack exchange,提问作者happenask

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:33:08