reactjs - 打字稿 - 使用键变量更改字典的值
问题描述
我有一个对象:
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'。
类型“字符串”不可分配给类型“从不”.ts(2322)
蒂亚!!!
解决方案
这里的问题是,如果您要为任意键分配值,那么该值必须具有可分配给您可能分配给它的每个键的类型。这意味着值的类型必须是string & number
可以分配给属性类型string
和number
属性类型的。交点string & number
是never
。
解决方案是使用泛型类型,因此upDatedValue
根据 的类型限制为具有正确的类型key
:
const updateValueInDict = <K extends keyof typeof sampleExpenseData>(
obj: typeof sampleExpenseData,
key: K,
upDatedValue: (typeof sampleExpenseData)[K]
): void => {
obj[key] = upDatedValue
}
这也意味着在调用函数时可以更严格地对参数进行类型检查。
推荐阅读
- d3.js - 如何使用 d3 js 在 .attr 中编写 if 条件
- twitter-bootstrap - Bootstrap 4 如何在行类中删除这些边距/填充
- xamarin - 没有显示共享 Xamarin Forms 项目的引用
- html - 媒体查询在第一个屏幕中有效,但在下一个屏幕中无效
- if-statement - ifc 函数的行为
- php - 如何准备好 Stripe Checkout V3 SCA
- node.js - 时间戳插入给出错误值
- html - 如何使跨度出现在另一个跨度下?
- outlook-addin - MS Outlook 2016 自定义插件可以将列添加到“选择房间”面板吗?
- java - 如何将扁平的 LinkedHashMap 转换为代表层次结构的 LinkedHashMap