我正在尝试使用useState
钩子存储对象数组,但无法获取描述其期望类型的语法。我要存储的类型是Array<Updates>
。
这是我的代码:
const [messages, setMessages] = useState<any>([]);
谢谢!
我选择通过Updates
数组进行映射,现在想存储每个Update
,这是一个普通对象,但此代码出现错误Argument of type '{}' is not assignable to parameter of type 'Update | (() => Update)'.
:>
const [messages, setMessages] = useState<Update>({}); // object in brackets is underlined with the error.
答案 0 :(得分:1)
您收到此错误,因为{}
不是Update
。如果我理解正确,则您希望Update为可为空。
类似的事情应该对您有用:
const [messages, setMessages] = useState<Update | null>(null);
这意味着messages
(为了更好的可读性,您可能应该重命名为update
)可以为null或Update
类型的对象。
如果您尝试不使用空检查而使用它,则会产生错误。
类似messages.name
之类的错误将导致错误消息,消息可能为空。
您可以通过编写类似const name = messages && messages.name
或简单的if语句来解决此问题。
if (messsages)
// do something here
const name = messages.name;
}
如果您100%表示尝试访问该消息时该消息永远不会为空,则可以使用!
像这样const name = messasges!.name;
答案 1 :(得分:0)
您当前正在将组件状态定义为单个Update对象,但是您需要将其定义为这些对象的数组:
const [messages, setMessages] = useState<Update[]>([]);
稍后,当您需要替换数组中的特定项目时,可以这样做:
var message = messages[3]; // lets say you want to change name of forth message
Object.assign([], messages, { 3: { ...message, name: 'New Name' } });
setMessages(messages);