【发布时间】:2020-04-02 21:29:45
【问题描述】:
我有一个 TypeScript 问题要问你。我想知道您如何在 useState 中使用 id、标题、带有接口的文本等传入属性“指定”单个对象。
见下面的代码:
import React, { useState, useEffect } from "react";
interface SinglePostProps {
match: any;
}
interface SinglePostState {
id: number;
heading: string;
text: string;
}
const Post: React.FC<SinglePostProps> = ({ match }) => {
useEffect(() => {
fetchSinglePost();
}, []);
const [singlePost, setSinglePost] = useState<SinglePostState>({});
const fetchSinglePost = async () => {
try {
const fetchSinglePost = await fetch(
`http://localhost:3001/api/posts/${match.params.id}`
);
const singlePost = await fetchSinglePost.json();
console.log("Single Post", singlePost);
setSinglePost(singlePost);
} catch (error) {
console.error(error);
}
};
return (
<>{/* <h1>{singlePost.heading}</h1>
<p>{singlePost.text}</p> */}</>
);
};
export default Post;
如果我控制台记录保存为 singlePost 状态的对象,我会收到以下消息:
据我了解,您想指定您是否期望一个数组或一个对象进入状态。因此,当我这样做时,我的 PostList 组件会在数组中呈现对象列表,我执行了以下操作,但它没有抱怨:
const [items, setItems] = useState<PostListState[]>([]);
我对 TypeScript 很陌生,所以如果有人能解释我如何处理这些 TypeScript 错误消息,我将不胜感激? :)
先谢谢了, 埃里克
【问题讨论】:
-
看起来它希望您提供一个具有在
SinglePostState接口中定义的所有属性的对象,因为它们不是optional。 -
嗯,也许吧。因此,如果我将属性设置为可选,它不会抱怨(显然),但你能告诉我为什么会这样吗?我应该怎么想?可选属性可以是未定义的吗?我是否总是必须在 useState 中将它们写成一个对象?
-
在您的情况下,您可能希望将状态对象设为可选,而不是属性。因此,在获取帖子时,您拥有
null而不是{},并且可以通过这种方式检查帖子是否准备就绪。我不使用 TS 但它可能接近/* ... */ = useState<SinglePostState | null>(null)
标签: javascript reactjs typescript react-hooks