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

TypeScript中如何根据对象key动态匹配对应类型赋值

解决对象属性赋值时类型匹配问题

要让value的类型与key对应的属性类型精确匹配,核心是让key和value的类型建立关联关系,而不是各自独立的联合类型。你遇到的never类型错误,是因为TypeScript无法推断出key和value之间的对应关系,只能取所有可能类型的交集(也就是不存在的never)。

解决方案:使用泛型关联Key与Value类型

将SettingType改为泛型接口,让它绑定到SliceStateType的某个具体键上,这样value的类型就会自动匹配该键对应的属性类型:

interface SliceStateType {
    TrptLimit: number;
    TrptOffset: number;
    someString: string;
    someBool: boolean;
}

// 泛型接口,K限定为SliceStateType的键类型
interface SettingType<K extends keyof SliceStateType> {
    key: K;
    value: SliceStateType[K];
}

const initialState: SliceStateType = {
    TrptLimit: 10,
    TrptOffset: 0,
    someString: 'my string',
    someBool: false,
};

// 定义泛型函数处理赋值,确保类型安全
function updateSetting<K extends keyof SliceStateType>(
    settings: SliceStateType,
    setting: SettingType<K>
) {
    settings[setting.key] = setting.value;
}

// 正确示例:类型自动匹配
updateSetting(initialState, { key: 'TrptLimit', value: 20 });
updateSetting(initialState, { key: 'someString', value: 'updated string' });

// 错误示例:类型不匹配会被TypeScript拦截
// updateSetting(initialState, { key: 'TrptLimit', value: '20' }); // 报错:string不能赋值给number

直接赋值场景的处理

如果不需要封装成函数,也可以通过泛型参数直接绑定类型关系:

function assignValue<K extends keyof SliceStateType>(
    settings: SliceStateType,
    key: K,
    value: SliceStateType[K]
) {
    settings[key] = value;
}

// 使用时自动匹配类型
assignValue(initialState, 'someBool', true);

原方案报错原因

原代码中key是keyof SliceStateType联合类型,value是number | string | boolean联合类型,两者没有关联。TypeScript会检查value是否能赋值给所有key对应的属性类型,而number | string | boolean没有共同的子类型,因此推断为never。通过泛型绑定K,TypeScript能明确当前key对应的具体类型,从而正确校验value的类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:30:53