如何在React CreateContext中正确为trainsDetails对象设置初始值
解决方案
方案1:不修改现有类型定义,直接补全全量默认值
按照TrainsDetailsResponseType的字段声明,给每个字段填充对应类型的初始值即可,这个初始值仅在Context没有被Provider包裹时生效,仅需要满足TS类型校验要求:
export const TrainsContext = createContext<TrainsContextValues>({ trainsList: [], trainsDetails: { trainId: '', trainNo: '', lineId: '', route: '', lineKmPosition: '', speed: 0, deviationFromTimetable: 0, mileage: 0, lastInspectionDate: '', nextInspectionDate: '', state: '', }, handlePushToTrainsDetails: () => undefined, trainId: '', });
同时你当前的useState声明没有传初始值,默认是undefined,和TrainsDetailsResponseType的必填要求不匹配,需要同步给初始值:
const [trainsDetails, setTrainsDetails] = useState<TrainsDetailsResponseType>({ trainId: '', trainNo: '', lineId: '', route: '', lineKmPosition: '', speed: 0, deviationFromTimetable: 0, mileage: 0, lastInspectionDate: '', nextInspectionDate: '', state: '', });
方案2:允许初始值为空,修改类型定义
如果你接受接口请求返回前trainsDetails为undefined的状态,可以直接修改TrainsContextValues的字段属性为可选/联合undefined类型,减少冗余的默认值编写:
interface TrainsContextValues { trainsList: TrainsListResponseType[]; trainsDetails?: TrainsDetailsResponseType; // 加问号变成可选属性 handlePushToTrainsDetails: (arg: string) => void; trainId: string; }
此时Context的初始值可以直接写trainsDetails: undefined,对应的useState声明不需要修改:
export const TrainsContext = createContext<TrainsContextValues>({ trainsList: [], trainsDetails: undefined, handlePushToTrainsDetails: () => undefined, trainId: '', }); // useState 声明保持不变即可 const [trainsDetails, setTrainsDetails] = useState<TrainsDetailsResponseType>();
注意:该方案下使用trainsDetails时需要做空值判断,避免读取属性时报错。
内容的提问来源于stack exchange,提问作者marcinb1986
相关产品推荐
相关产品推荐

