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

如何为组件添加泛型类型以接收不同类型的props数据

解决方案:用泛型实现类型安全的通用数据网格组件

针对你遇到的多类型数据适配问题,无需维护庞大的联合类型或使用any,核心方案是给组件添加泛型约束,让组件自动适配任意符合结构规范的业务数据类型。

1. 抽象通用Props结构

所有业务类型(TUsers、TProducts等)的共性是包含一个data数组,我们用泛型抽象这个通用结构:

// 泛型T代表data数组中单个元素的类型
type DataGridProps<T> = {
  data: {
    data: T[];
  };
};

2. 实现泛型组件

以React组件为例(其他框架逻辑一致),通过泛型让TypeScript自动推导传入数据的类型:

function DataGrid<T>(props: DataGridProps<T>) {
  // 此时props.data.data的类型为T[],完全类型安全
  return (
    <div className="data-grid">
      {props.data.data.map((item, idx) => (
        <div key={idx}>
          {/* 可根据不同业务类型做差异化渲染,也可通过类型守卫进一步约束 */}
          {('username' in item) ? item.username : ('productname' in item) ? item.productname : ''}
        </div>
      ))}
    </div>
  );
}

3. 调用组件时自动推导类型

无需手动声明联合类型,传入业务数据时TypeScript会自动识别元素类型:

// 业务类型定义
type TUsers = { data: { username: string }[] };
type TProducts = { data: { productname: string }[] };
type TCustomers = { data: { customername: string }[] };

// 场景1:传入用户数据,自动推导T为{ username: string }
const users: TUsers = { data: [{ username: 'myName' }] };
<DataGrid data={users} />;

// 场景2:传入商品数据,自动推导T为{ productname: string }
const products: TProducts = { data: [{ productname: 'prod' }] };
<DataGrid data={products} />;

4. 进阶:给泛型加约束(可选)

如果所有业务数据的元素有共同属性(比如id),可以给泛型加约束,进一步提升类型安全性:

// 约束:所有元素必须包含id属性
type BaseItem = { id: string | number };

// 泛型T必须符合BaseItem的结构
type DataGridProps<T extends BaseItem> = {
  data: {
    data: T[];
  };
};

// 此时业务类型需包含id
type TUsers = { data: { id: number; username: string }[] };

这种方案不管新增多少种业务类型,都无需修改组件的类型定义,完全实现了类型安全与通用性的平衡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:33:20