尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

用 TypeScript 配合 rc-table 开发:列名写错、数据结构变化,编译期就能抓住

用 TypeScript 配合 rc-table 开发:列名写错、数据结构变化,编译期就能抓住 用 TypeScript 配合 rc-table 开发列名写错、数据结构变化编译期就能抓住【免费下载链接】table Low-level table primitives for React, maintained in the Ant Design ecosystem.项目地址: https://gitcode.com/gh_mirrors/tab/table用 rc-table 做表格时一个很隐蔽的问题是dataIndex拼错一个字母或者接口返回的字段名变了页面不会报错单元格只是安静地显示为空往往要人工逐列核对才能发现。这篇文章讲如何用 rc-table 自带的 TypeScript 泛型把这类问题从运行时挪到编译期并用三个短代码示例给出最短可用链路。核心结论一个泛型参数约束整张表rc-table 的Table是泛型组件TablePropsRecordType用同一个类型参数同时约束data、columns、rowKey和各种渲染回调。把数据接口显式写成泛型参数后列名拼错、字段不存在、render 参数用错大部分都会在编译阶段被拦下来。最小示例类型安全表格的三个要素链路只有三步定义数据接口 → 显式指定泛型 → 写 columns 和 data。interface Order { id: number; product: string; amount: number; } // 显式指定泛型columns 和 data 都会按 Order 检查 TableOrder columns{[ { title: 商品, dataIndex: product }, { title: 金额, dataIndex: amount }, ]} data{orders} rowKeyid /关键点在TableOrder这一处。如果泛型没有写明组件会退而依赖data推断一旦 data 是any或宽泛的Recordstring, any所有检查会静默失效。所以建议始终显式写出泛型。另外columns 若在组件外单独定义可以用TablePropsOrder[columns]标注这个数组列定义写在别的文件里同样受检查。关键概念起作用的三个类型ColumnType 如何避免列名写错ColumnTypeRecordType是单列的类型。dataIndex的合法值来自RecordType的字段路径写producd会直接类型报错写product才通过。这相当于把我觉得写对了变成编译器验证过。rowKey 如何约束主键字段在TableProps中rowKey的类型是string | keyof RecordType | 函数。传字段名时id必须是Order上真实存在的字段如果数据没有稳定主键可以传(record, index) Key的函数形式动态计算。render 函数的类型推断怎么用列的render接收(value, record, index)三个参数。其中record被推断为RecordType写操作列时handleEdit(record)不需要手动断言类型回调里拿到的就是完整的行数据。进阶场景嵌套字段列与自定义渲染字段嵌套时dataIndex写数组形式的路径仍然逐层检查计算型字段数据里不存在的列只写key和render不要写不存在的dataIndex// 嵌套路径写成数组最多三层写错立即报类型错误 { title: 收货城市, dataIndex: [address, city] }, // 计算型列没有 dataIndex只给 key 和 render { title: 操作, key: action, render: (_: unknown, record: Order) ( a onClick{() handleEdit(record)}编辑/a ), },需要分组表头 子列的结构时用带children的列对象ColumnGroupType此时该列不再提供dataIndex数据量大时项目还提供了VirtualTable做虚拟滚动。避坑检查清单⚠️ 忘了显式泛型data 类型宽泛时所有检查静默失效务必写TableOrder。❌ 嵌套字段写a.b字符串要用数组[a, b]且最多三层。render的第一个参数value是any别拿它做类型判断类型安全体现在第二个参数record上。rowKey值重复会导致行行为异常没有稳定 id 的数据用函数形式生成 key。计算列误写了不存在的dataIndex会静默取到undefined。分组列和叶子列混排时用ColumnsTypeRecordType约束整个数组。下一步组件文档入口在docs/index.md最小可运行示例见docs/examples/simple.tsx。核心类型定义ColumnType、ColumnsType在src/interface.tsTableProps在src/Table.tsx。列的预处理逻辑含把 children 列转换成 columns 数组可以看src/hooks/useColumns/。虚拟滚动用法参考docs/demo/virtual.md。想读源码可以本地克隆git clone https://gitcode.com/gh_mirrors/tab/table【免费下载链接】table Low-level table primitives for React, maintained in the Ant Design ecosystem.项目地址: https://gitcode.com/gh_mirrors/tab/table创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表