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

如何在TypeScript中向React Context Provider传递值?

修复React转TypeScript的Context类型错误

错误核心原因

你定义Context时指定的类型是null,但Provider传递的是包含greenValue和redValue的对象,类型完全不匹配,这是报错的主要原因。另外还有useState初始化方式错误、类型声明不完整的问题,下面是分步修复方案:


步骤1:定义Context的正确类型

先明确Context要传递的值的结构,声明对应的类型:

// 定义单个值对象的类型(适配greenValue/redValue的结构)
type ValueSet<T> = {
  vals: Set<T>;
  setVals: React.Dispatch<React.SetStateAction<Set<T>>>;
};

// 定义Context的整体类型
type InputListContextType = {
  greenValue: ValueSet<MyEnum>;
  redValue: ValueSet<MyEnum>;
};

创建Context时,用上述类型替代null,同时设置合理默认值(避免未包裹Provider时使用报错):

export const inputListContext = createContext<InputListContextType>({
  greenValue: { vals: new Set<MyEnum>(), setVals: () => {} },
  redValue: { vals: new Set<MyEnum>(), setVals: () => {} }
});

步骤2:修复useState的初始化错误

你当前的useState(Set<MyEnum>)是把Set构造函数当成初始值,导致状态类型变成构造函数而非Set实例。正确写法是传递Set的实例:

const [greenVals, setGreenVals] = useState<Set<MyEnum>>(new Set<MyEnum>());
const [redVals, setRedVals] = useState<Set<MyEnum>>(new Set<MyEnum>());

步骤3:完善checkBoxParams的类型

替换any为明确类型,避免类型丢失:

type CheckBoxParams = {
  myEnum: MyEnum;
  name: string;
};

步骤4:修正Provider的值传递

确保greenValue/redValue的结构和ValueSet类型匹配:

const greenValue = { vals: greenVals, setVals: setGreenVals };
const redValue = { vals: redVals, setVals: setRedVals };

如果想保留原字段名(如greenVals而非vals),只需调整ValueSet的字段名即可,确保和Context类型一致

完整修复后的代码

import { createContext, useState, Dispatch, SetStateAction } from 'react';
import { MyEnum, FirmStatusEnum } from "../ts-api-script";

// 定义单个值对象的类型
type ValueSet<T> = {
  vals: Set<T>;
  setVals: Dispatch<SetStateAction<Set<T>>>;
};

// 定义Context类型
type InputListContextType = {
  greenValue: ValueSet<MyEnum>;
  redValue: ValueSet<MyEnum>;
};

// 创建Context并指定类型和默认值
export const inputListContext = createContext<InputListContextType>({
  greenValue: { vals: new Set<MyEnum>(), setVals: () => {} },
  redValue: { vals: new Set<MyEnum>(), setVals: () => {} }
});

// 完善Checkbox参数类型
type CheckBoxParams = {
  myEnum: MyEnum;
  name: string;
};

export const Options = () => {
  // 正确初始化Set状态
  const [greenVals, setGreenVals] = useState<Set<MyEnum>>(new Set<MyEnum>());
  const [redVals, setRedVals] = useState<Set<MyEnum>>(new Set<MyEnum>());

  const greenValue = { vals: greenVals, setVals: setGreenVals };
  const redValue = { vals: redVals, setVals: setRedVals };

  return (
    <inputListContext.Provider value={{ greenValue, redValue }}>
      <Checkbox myEnum={FirmStatusEnum.Op} name="Option 1" />
    </inputListContext.Provider>
  );
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:40:22