Typescript-使用键变量更改字典的值

时间:2019-12-20 23:04:51

标签: reactjs typescript

我有一个对象:

const sampleExpenseData = {
  Time: "11-12-19",
  Meals: 5130,
  Pantry: 10,
  Living: 10,
  Others: 0,
  Total: 74
}

我想定义一个函数,以便它可以更新特定键的值,到目前为止,我是这样的:

const updateValueInDict = (
  obj: typeof sampleExpenseData,
  key: keyof typeof sampleExpenseData,
  upDatedValue: string | number
): void => {
  obj[key] = upDatedValue  // this line throws error
}

错误提示:

  

键入“字符串|数字”不能分配为“从不”类型。

     

类型'string'不能分配给类型'never'.ts(2322)

TIA !!!

1 个答案:

答案 0 :(得分:1)

这里的问题是,如果您要为任意键分配一个值,则该值必须具有可分配给您可能要为其分配给每个键的类型。这意味着该值的类型必须为string & number,才能同时分配给stringnumber属性类型。交集string & numbernever

解决方案是使用通用类型,以便根据upDatedValue的类型来约束key具有正确的类型:

const updateValueInDict = <K extends keyof typeof sampleExpenseData>(
  obj: typeof sampleExpenseData,
  key: K,
  upDatedValue: (typeof sampleExpenseData)[K]
): void => {
  obj[key] = upDatedValue
}

这还意味着在调用函数时可以更严格地检查参数的类型。

Playground Link