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

在TypeScript中使用createContext传递setState函数的类型问题

解决React Context中setState函数默认值的TypeScript类型兼容问题

要解决这个TypeScript类型不兼容的问题,核心是先明确Context的类型定义,再给setDarkModeState提供符合Dispatch<SetStateAction<string>>类型的默认值,具体步骤如下:

1. 导入必要类型并定义Context接口

从React中导入Dispatch和SetStateAction类型,创建接口约束Context的结构:

import { createContext, useState, useEffect, Dispatch, SetStateAction } from "react";
import useLocalStorage from "../../hooks/useLocalStorage/";

interface DarkModeContextProviderProps {
  children?: React.ReactNode;
}

// 定义Context的类型结构
interface DarkModeContextType {
  isDarkMode: boolean;
  darkModeState: string;
  toggleIsDarkMode: () => void;
  setDarkModeState: Dispatch<SetStateAction<string>>;
}

2. 创建Context时传入符合类型的默认值

基于上面的接口创建Context,给setDarkModeState提供空但符合类型要求的默认函数:

export const DarkModeContext = createContext<DarkModeContextType>({
  isDarkMode: false,
  darkModeState: "off",
  toggleIsDarkMode: () => {},
  // 空函数符合Dispatch类型,TS允许忽略函数参数
  setDarkModeState: () => {},
});

3. 统一组件内初始值(可选但推荐)

组件中darkModeState初始值是"",和Context默认值"off"不一致,建议统一:

const [darkModeState, setDarkModeState] = useState("off");

完整修改后的代码

import { createContext, useState, useEffect, Dispatch, SetStateAction } from "react";
import useLocalStorage from "../../hooks/useLocalStorage/";

interface DarkModeContextProviderProps {
  children?: React.ReactNode;
}

interface DarkModeContextType {
  isDarkMode: boolean;
  darkModeState: string;
  toggleIsDarkMode: () => void;
  setDarkModeState: Dispatch<SetStateAction<string>>;
}

export const DarkModeContext = createContext<DarkModeContextType>({
  isDarkMode: false,
  darkModeState: "off",
  toggleIsDarkMode: () => {},
  setDarkModeState: () => {},
});

export const DarkModeContextProvider = ({
  children,
}: DarkModeContextProviderProps) => {
  const [isDarkMode, setIsDarkMode] = useState(false);
  const [darkModeState, setDarkModeState] = useState("off");
  const [localStorageDarkMode, setLocalStorageDarkMode] = useLocalStorage(
    "darkModeState",
    darkModeState
  );

  const toggleIsDarkMode = () => {
    setIsDarkMode((prev) => !prev);
  };

  const value = {
    isDarkMode,
    toggleIsDarkMode,
    darkModeState,
    setDarkModeState,
  };
  
  useEffect(() => {
    setDarkModeState(localStorageDarkMode);
  }, [localStorageDarkMode]);
  
  useEffect(() => {
    setLocalStorageDarkMode(darkModeState);
  }, [darkModeState]);

  return (
    <DarkModeContext.Provider value={value}>
      {children}
    </DarkModeContext.Provider>
  );
};

报错原因说明

原来的代码中,TS会自动推断createContext的类型,setDarkModeState被推断为() => void,但实际传入Provider的是Dispatch<SetStateAction<string>>类型(useState<string>()返回的setState函数),两个类型不兼容导致报错。通过提前定义Context类型接口,强制默认值和实际值类型一致,就能解决这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:15:25