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

React TypeScript中如何为createContext定义允许null的类型并解决报错?

解决React Modal Context的TypeScript解构错误

问题原因

你定义的ModalContext类型为TModalContext | null,调用useModalContext返回的是这个联合类型。当尝试解构数组时,TypeScript无法确定返回值一定是数组(可能为null),因此抛出类型错误。

解决方案1:在自定义Hook中添加运行时检查与类型断言

修改useModalContext钩子,加入运行时校验确保组件必须在ModalProvider内部使用,同时让TypeScript推断出返回值为非null的数组类型:

import React, { useState } from 'react';

type TModal = boolean;
type TModalContext = [TModal, React.Dispatch<React.SetStateAction<TModal>>];

const ModalContext = React.createContext<TModalContext | null>(null);

const ModalProvider = ({ children }: { children: React.ReactNode }) => {
    const modalState = useState<TModal>(false);
    return <ModalContext.Provider value={modalState}>{children}</ModalContext.Provider>;
};

const useModalContext = () => {
    const context = React.useContext(ModalContext);
    // 运行时检查,强制组件在Provider内使用
    if (!context) {
        throw new Error('useModalContext 必须在 ModalProvider 组件内部使用');
    }
    return context;
};

此时调用const [isOpen, setOpen] = useModalContext();时,TypeScript会确认返回值为TModalContext类型,不会再报错。

解决方案2:提供符合类型的默认值

如果能确保所有使用useModalContext的组件都在ModalProvider内部,也可以直接给createContext提供一个符合TModalContext类型的默认值,避免联合null类型:

const ModalContext = React.createContext<TModalContext>([false, () => {}]);

这种方式无需额外运行时检查,但如果组件意外在Provider外使用,会拿到无意义的默认setter,需根据业务场景选择。

内容的提问来源于stack exchange,提问作者Epple

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 01:12:49