【发布时间】:2020-07-20 02:25:48
【问题描述】:
我正在尝试创建一个函数,该函数接受一个键和一个值并更新类型化对象上的相应键值对。这是我所追求的基本示例。
Link to code sandbox with below code
type x = {
prop : number,
other : string
}
let dataToUpdate : x = {
prop: 1,
other: "string"
}
function updateKey(key : string, value : number | string) {
dataToUpdate[key] = value;
}
我在上面的实现中遇到了这个错误。
元素隐式具有
'any'类型,因为'string'类型的表达式不能用于索引'x'类型。 在'x'类型上找不到带有'string'类型参数的索引签名。(7053)
更新 我被介绍了XY Problem 的想法。下面是我所追求的实际实现。我正在尝试在 React 中创建一个上下文,该上下文返回一个函数,该函数允许您仅更新存储在上下文中的对象中的特定属性
export function StoreProvider(props: any) {
const [storeData, setStoreData] = useState<StoreData>(initProviderData);
function setStoreKeyValue(keyToUpdate: keyof StoreData[], valueToSet: boolean | string | number | null){
let newStoreData = {...storeData);
const isStoreData = Object.keys(initProviderData).filter((key) => { key == keyToUpdate }).length > 1;
if (isStoreData && newStoreData) {
newStoreData[keyToUpdate] = valueToSet;
setStoreData(newStoreData)
}
}
return (
<StoreContext.Provider value={{ "storeData": storeData, "setStoreData": setStoreData }}>
{props.children}
</StoreContext.Provider>
)
}
【问题讨论】:
-
首先,
key没有理由成为数字。 -
我删除了所有不相关的标签,但既然你列出了 reactjs,我想这是一个XY problem,你真的应该问你想要解决的真实情况而不是你的障碍'现在正面临着打字。
-
不错的编辑!接下来我看到:
newStoreData[keyToUpdate]是 mutating the currentstoreDataobject,这是一个 anti-pattern as this state should stay immutable。 -
快速 JS 提示:
value={{ storeData, setStoreData }}只要变量名和键相同就足够了。这是Object initializer property shorthand。 -
也就是说,不是
key和value参数,您可以考虑使用Partial<StoreData>type 的对象参数?
标签: reactjs typescript