如果要存储对象数组,如何定义useState挂钩期望的类型?

时间:2019-10-19 11:42:38

标签: reactjs typescript react-hooks

我正在尝试使用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.

2 个答案:

答案 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);