【问题标题】:Typescript - change value of a dictionary with a key variable打字稿 - 使用键变量更改字典的值
【发布时间】:2019-12-20 23:04:51
【问题描述】:

我有一个对象:

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
}

错误提示:

键入'字符串 | number' 不能分配给类型 'never'。

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

TIA!!!

【问题讨论】:

    标签: reactjs typescript


    【解决方案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

    【讨论】:

    • 您也可以考虑将typeof sampleExpenseData 更改为通用参数。
    • 是的,这大大简化了声明,并且可能更好;我只是想尽可能少地更改代码以展示这个想法。也就是说,在某些情况下可能存在一个缺点,如果您希望能够像 updateValueInDict&lt;'foo'&gt;(bar, baz, quz) 那样明确指定类型参数,那么使用第二个类型参数可能会更烦人。
    • 谢谢,但还有一件事:我还想将一些键转换为数字,当我执行 if(!isNaN(number(updatedValue))) text = Number(updatedValue) 时会引发错误。类型“数字”不可分配给类型“从不”
    • 这似乎与这段代码没有任何关系。我建议将其作为一个单独的问题提出,并且您需要包含完整的minimal reproducible example
    • 酷如!非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2018-06-20
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多