为何TypeScript认为我的Immer Draft是undefined?
问题原因
你遇到的类型错误核心在于TypeScript无法关联field与value的具体对应类型:
MyConfigKeys是配置对象所有键的联合类型,MyConfigValues是所有值类型的联合类型- 执行
draft[field] = value时,TypeScript会把draft[field]推断为所有值类型的交集(比如string & number & boolean的结果是never,你的场景中表现为undefined),而value是松散的联合类型,自然无法赋值到严格的交集类型上
解决方案
最稳妥的方式是用泛型约束让field和value的类型一一绑定,具体修改如下:
1. 先确保配置类型定义清晰(示例)
interface MyConfigType { // 替换为你的实际配置字段 theme: string; fontSize: number; enableNotifications: boolean; } const INITIAL_CONFIG: MyConfigType = { theme: "light", fontSize: 14, enableNotifications: true }; type MyConfigKeys = keyof MyConfigType;
2. 将updateField改为泛型函数
function updateField<K extends MyConfigKeys>(field: K, value: MyConfigType[K]): void { setData(draft => { draft[field] = value; }); }
这样TypeScript能精准推断:传入某个具体field时,value必须匹配该字段的类型(比如传theme时,value只能是string),赋值操作不再触发类型错误。
可选方案(不推荐,牺牲类型安全)
如果暂时不想用泛型,可通过类型断言强制跳过检查,但会失去TypeScript的类型保护:
function updateField(field: MyConfigKeys, value: MyConfigValues): void { setData(draft => { draft[field] = value as MyConfigType[typeof field]; }); }
内容的提问来源于stack exchange,提问作者sashaikevich
相关产品推荐
相关产品推荐

