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

React Context结合TypeScript使用时出现类型错误求助

React Context结合TypeScript使用时出现类型错误求助

嗨,这个问题我之前也踩过坑!核心原因其实是你没有给FilterContext定义正确的类型——当你用createContext创建上下文的时候,如果不指定明确的类型,TypeScript会默认把它的类型推断为never,这就导致你传入的[todos, setTodos](类型是[Todo[], React.Dispatch<React.SetStateAction<Todo[]>>])和never类型不兼容,所以才会报错。

给你两个关键的修复步骤:

1. 给FilterContext指定匹配的类型

首先要明确你要通过上下文传递的内容结构,这里是一个包含todos数组和setTodos setter函数的元组,先定义这个类型再创建上下文:

import { createContext, useState, ReactNode } from 'react';

// 定义Context的类型:完全匹配你要传递的[todos, setTodos]结构
type FilterContextType = [
  Todo[],
  React.Dispatch<React.SetStateAction<Todo[]>>
];

// 创建Context时指定类型,同时给一个符合类型的默认值(空数组+空函数)
const FilterContext = createContext<FilterContextType>([[], () => {}]);

要是不想写空函数当默认值,也可以用类型断言:createContext<FilterContextType>(null as unknown as FilterContextType),不过更推荐用符合类型的默认值,类型安全性更高。

2. 优化组件的类型定义

另外,把Props里的children类型从any改成React.ReactNode会更规范,这是React官方定义的合法子元素类型,比any更严谨:

interface Todo {
  id: number;
  name: string;
}

// 规范children的类型
type Props = {
  children: React.ReactNode;
};

// 建议把组件名改成TodoContextProvider,和Context名区分开,可读性更强
function TodoContextProvider({ children }: Props) {
  const [todos, setTodos] = useState<Todo[]>([]);

  return (
    <FilterContext.Provider value={[todos, setTodos]}>
      {children}
    </FilterContext.Provider>
  );
}

这样改完之后,TypeScript就不会再报类型不兼容的错误了。本质就是要让Context的类型和你传递的value类型完全匹配,TypeScript才会认可。

备注:内容来源于stack exchange,提问作者Sjoerd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 11:47:42