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

如何让接口中的属性类型相互关联?

解决TypeScript中TableColumn字段与渲染函数参数类型关联问题

要让field属性的取值和renderCell的dataItem类型严格对应,你需要给TableColumn接口增加一个具体键名的泛型参数,而非仅依赖整个数据结构的泛型D。

修改后的类型定义

import type { ReactNode } from 'react';

interface TableColumn<D, K extends keyof D> {
  field: K;
  renderCell: (dataItem: D[K]) => ReactNode;
}

interface Data {
  foo: string;
  bar: Date;
  fiz: number;
}

const data: Data = {
  foo: "my foo",
  bar: new Date(),
  fiz: 32
}

使用示例

现在每个TableColumn实例会根据field的取值自动推导dataItem的具体类型:

// dataItem 类型为 string
const tableColumn: TableColumn<Data, 'foo'> = {
  field: "foo",
  renderCell: (dataItem) => dataItem 
}

// dataItem 类型为 Date
const tableColumn1: TableColumn<Data, 'bar'> = {
  field: "bar",
  renderCell: (dataItem) => dataItem 
}

// dataItem 类型为 number
const tableColumn2: TableColumn<Data, 'fiz'> = {
  field: "fiz",
  renderCell: (dataItem) => dataItem 
}

更简洁的自动推导方式

如果不想手动指定K,可以创建辅助函数让TypeScript自动推导类型:

function createTableColumn<D, K extends keyof D>(column: TableColumn<D, K>) {
  return column;
}

// 自动推导 dataItem 为 string
const tableColumn = createTableColumn<Data>({
  field: "foo",
  renderCell: (dataItem) => dataItem 
});

这样就能保证field和renderCell的参数类型完全绑定,不会再出现string | Date | number的联合类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:45:34