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
相关产品推荐
相关产品推荐

