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

如何在TypeScript中结合createContext传递状态变量并解决TS2554错误

解决TypeScript中createContext的TS2554错误

错误原因

TypeScript版本的createContext必须传入符合上下文类型的默认值(或通过泛型明确类型并配合合理默认值),因为TS需要明确上下文的类型信息,而JS版本可以省略默认值,这是两者的核心差异。

修复步骤及代码

1. 定义上下文类型

先明确NavContext的value类型,对应要传递的状态和状态修改函数:

import { createContext, useState, ReactFC, ReactNode, Dispatch, SetStateAction } from 'react';

// 定义NavContext的类型
type NavContextType = {
  isDrawerOpen: boolean;
  setIsDrawerOpen: Dispatch<SetStateAction<boolean>>;
};

2. 创建带默认值的上下文

给createContext传入符合上述类型的默认值,让TS识别上下文类型,同时消除错误:

// 创建上下文并传入默认值
export const NavContext = createContext<NavContextType>({
  isDrawerOpen: false,
  setIsDrawerOpen: () => {}, // 空函数作为默认的状态修改器
});

3. 修正NavBar组件的类型定义

组件的props类型可以简化,直接声明children的可选类型:

const NavBar: ReactFC<{ children?: ReactNode }> = ({ children }) => {
  const [isDrawerOpen, setIsDrawerOpen] = useState(false);

  return (
    <NavContext.Provider value={{ isDrawerOpen, setIsDrawerOpen }}>
      <AppBar position="static">{children}</AppBar>
    </NavContext.Provider>
  );
};

补充说明

如果不想传入真实的默认值,也可以用类型断言(但不推荐,因为使用useContext时需要处理可能的undefined):

export const NavContext = createContext<NavContextType | undefined>(undefined);

这种方式下,使用useContext时需要加上非空断言或判断:

const { isDrawerOpen, setIsDrawerOpen } = useContext(NavContext)!;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:01:21