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

如何在TypeScript中使用动态键为指定类型对象赋值并避免类型错误?

问题原因

你遇到的错误根源在于DimArgument的字段类型不统一:id和label是string类型,但defaultValue是number类型。当你用keyof DimArgument作为field参数时,TypeScript无法确定当前要赋值的字段到底对应哪种类型,而你传入的value固定是string,如果field是defaultValue(需要number)就会类型冲突,所以TypeScript把赋值的目标类型推断为never(没有类型能同时满足string和number),导致报错。

解决方案

方案1:泛型实现类型安全的字段更新(推荐)

通过泛型约束,让field和value的类型严格对应,确保传入的值和目标字段类型匹配,从根源避免类型错误:

export type DimArgument = { id: string, label: string, defaultValue: number };

// 假设dimArgument是预先定义好的该类型对象
let dimArgument: DimArgument = { id: "1", label: "test", defaultValue: 0 };

const changeHandler = <K extends keyof DimArgument>(
  field: K,
  value: DimArgument[K]
) => {
  dimArgument[field] = value; // 不再报错
};

// 正确调用示例
changeHandler("id", "new-id");
changeHandler("defaultValue", 100);
// 错误调用会被TypeScript自动拦截:类型"string"的参数不能赋给类型"number"的参数
// changeHandler("defaultValue", "100");

方案2:类型断言(仅在你能确保类型安全时使用)

如果你能明确保证当前传入的value和field对应的类型匹配,可以用类型断言跳过TypeScript的检查,但这种方式不安全,容易引入隐性类型错误:

const changeHandler = (
  field: keyof DimArgument,
  value: string | number
) => {
  dimArgument[field] = value as DimArgument[keyof DimArgument];
};

方案3:分字段类型处理

如果你的场景中value始终是字符串,但defaultValue需要转成数字,可以在函数内部做类型判断和转换:

const changeHandler = (
  field: keyof DimArgument,
  value: string
) => {
  if (field === "defaultValue") {
    dimArgument[field] = Number(value);
  } else {
    dimArgument[field] = value;
  }
};

内容的提问来源于stack exchange,提问作者ינון רחמים

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:22:44