我刚开始学习typescript react,但不知道如何正确地将JSON变量从API调用传递到带有接口的组件。
export default function App() {
const [calendarData, setCalendarData] = useState<ICalendarProps>();
useEffect(() => {
fetchData();
}, []);
const fetchData = async () => {
const url = Constants.API_URL_GET_AVAILABLE;
const data = {
date: encodeURIComponent('2023-03-01'),
period: encodeURIComponent(30),
duration: encodeURIComponent(30),
}
await fetch(url + `?Date=${data.date}&Period=${data.period}&Duration=${data.duration}`, {
method: 'GET'
})
.then(response => response.json())
.then(postsFromServer => {
console.log(postsFromServer);
setCalendarData(postsFromServer);
})
.catch((error) => {
console.log(error);
})
}
return (
<div>
<CalendarView data={calendarData} /> {/* <--- here i get error */}
</div>
);
}
我收到了这样的错误
TS2322: Type 'ICalendarProps | undefined' is not assignable to type '{ Date: string; Availables: number; Terms: ITerm; }'.
Type 'undefined' is not assignable to type '{ Date: string; Availables: number; Terms: ITerm; }'.
我试图传递变量的组件如下所示
export default function CalendarView(props: ICalendarProps) {
const [data, setData] = useState(props.data);
return <div></div>;
}
和自定义界面
export interface ICalendarProps {
data: {
Date: string;
Availables: number;
Terms: ITerm;
}
}
export interface ITerm {
Time: string;
Duration: number;
IsOccupied: number;
IsVisible: number;
}
我试图初始化变量,我试图传递。也试图返回后,获取数据,但不知道如何。一定有什么我错过了。这是正确的方式写React?
1条答案
按热度按时间wvyml7n51#
问题
出错的根本原因是
CalendarView
组件的 prop 类型为ICalendarProps
,是一个必需的 prop 。最重要的是,状态变量和prop * 的类型不匹配 *。(下一节将解释)
但是,如果您在
App
组件中看到,我们有其引用
calendarData
以传递到 prop 中的data
字段。此
calendarData
是从useState
返回值反结构化的变量,如下所示正如您所看到的,初始状态是
undefined
,因此,您会得到错误,因为可能的undefined
变量被传递到data
prop,该prop应该是某个定义的类型。修复
我认为状态变量的类型需要更新,让我使用下面定义的接口来解决它。
1.最基本的修复之一是将
ICalendarProps
更新为这将
data
标记为可选,并且将正常工作。1.另一种方法是提供以下类型的默认变量
1.您还可以尝试为状态指定一个初始值,以使用上面定义的
defaultData
解决此问题