【发布时间】:2021-05-12 22:38:34
【问题描述】:
我有这个问题。
带接口:
export interface IDevice {
id: string,
selected: boolean
}
通过以下方式创建实例:
let newDevice: IDevice = {
id: uuid4(),
selected: false,
} as IDevice;
它以反冲状态添加到数组中,并且在 React 中用于一个函数,其中数组已通过 useRecoilState() 检索。
const [leftList, setLeftList] = React.useState<IDevice[]>([]);
现在它被用于在列表控件上选择设备的处理程序中,出现错误:
...
leftList.map((item: IDevice) => {
if (item.id === event.dataItem.id) {
item.selected = !item.selected;
}
return item;
})
...
我收到错误:无法分配给对象“#”的只读属性“已选择”
即使首先通过 [...leftList] 克隆数组也无济于事。
我迷路了:-) 希望有人能对此有所了解吗?
【问题讨论】:
-
不应直接修改状态,这是 TS 试图通过将对象设为只读来告诉您的,创建一个新对象并返回
return {...item, selected: item.id === event.dataItem.id ? !item.selected : item.selected}。使用扩展语法克隆数组只会做浅拷贝,不会对其中的对象进行深拷贝
标签: javascript typescript interface instance readonly