You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:15:04