为何this.settingData[key]类型为never?TypeScript类型报错疑问
问题原因
你遇到的这个never类型报错,核心是TypeScript的类型检查无法确认key和value的对应关系:
- 当
key是inlineType时,对应的value类型应该是InlineEnum - 当
key是localCodeRepo时,对应的value类型应该是boolean
但你把value的类型定义成InlineEnum | boolean,TypeScript会判定存在类型不匹配的风险——比如可能用boolean值给inlineType赋值,或者用InlineEnum值给localCodeRepo赋值。此时TypeScript会取两个字段类型的交集,而InlineEnum和boolean没有任何交集,所以交集类型就是never,最终触发报错。
你删除inlineType后,只剩下localCodeRepo一个字段,key只能指向这个字段,value的boolean类型和字段类型完全匹配,报错自然就消失了。
解决方案
用泛型约束key和value的对应关系,让TypeScript能根据传入的key自动推断出正确的value类型:
enum InlineEnum { auto, manual, close } interface DataType { inlineType: InlineEnum; localCodeRepo: boolean; } class Cla { private settingData: DataType = { inlineType: InlineEnum.auto, localCodeRepo: false } setConfig<K extends keyof DataType>(key: K, value: DataType[K]) { this.settingData[key] = value; } }
这样调用setConfig时,TypeScript会自动做类型校验:
- 传
inlineType时,value必须是InlineEnum类型 - 传
localCodeRepo时,value必须是boolean类型
彻底规避类型不匹配的问题。
内容的提问来源于stack exchange,提问作者shuwenkai
相关产品推荐
相关产品推荐

