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

如何在React createContext中传递TypeScript泛型参数?

如何在React createContext中传递TypeScript泛型参数?

你碰到的这个TS2304错误其实很好解决,核心问题就是代码里的TData泛型参数没被正确声明——TypeScript压根不知道这个TData到底指的是什么类型。我给你两种解决方案,你可以根据需求选:

方案一:快速修正(基础版)

如果你只是想先让代码通过编译,用这个写法就行,只需要给TData加上泛型声明和默认类型:

import { createContext } from "react" 
import { RowData, Table } from "@tanstack/react-table"  

// 给TData声明为泛型参数,同时指定默认类型为RowData
export const TableContext = createContext<Table<TData extends RowData = RowData>>(undefined as never)

这样TypeScript就能识别TData了,它会默认用RowData作为基础类型,你后续也能给Context传入更具体的Table实例。

方案二:泛型化Context(灵活版)

要是你需要这个Context能适配不同的行数据类型,后续扩展更方便,那推荐用这种结合自定义Hook的写法,既能保证类型安全,又足够灵活:

  1. 先定义Context的泛型类型并创建Context:
import { createContext, useContext } from "react";
import { RowData, Table } from "@tanstack/react-table";

// 定义Context支持的泛型类型,默认用RowData兜底
export type TableContextType<TData extends RowData = RowData> = Table<TData> | undefined;

// 创建Context,默认值设为undefined
export const TableContext = createContext<TableContextType>(undefined);
  1. 写一个泛型自定义Hook,方便子组件安全使用Context:
export function useTableContext<TData extends RowData>(): Table<TData> {
  const context = useContext(TableContext) as TableContextType<TData>;
  
  // 可选:加个运行时检查,避免在Provider外面误用Hook导致报错
  if (!context) {
    throw new Error("useTableContext 必须在 TableContext.Provider 内部使用哦");
  }
  
  return context;
}
  1. 实际使用的时候,父组件传入具体的Table实例,子组件用Hook指定类型:
// 父组件示例,假设MyRowData是你自己定义的行数据类型
const myTable = useTable({ columns, data: myData as MyRowData[] });

<TableContext.Provider value={myTable}>
  <MyTableSubComponent />
</TableContext.Provider>
// 子组件示例
import { useTableContext } from "./path-to-your-context-file";

function MyTableSubComponent() {
  // 指定具体的行数据类型,就能拿到完全类型安全的Table实例
  const table = useTableContext<MyRowData>();
  
  // 这里table的类型是Table<MyRowData>,TypeScript会给你完整的类型提示
  return <>{/* 你的表格渲染逻辑 */}</>;
}

这种写法的好处是,不管后续你的行数据类型怎么变,这个Context都能适配,而且全程有类型保障,不用手动写一堆类型断言。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 13:34:31