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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:40:48