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

TypeScript传递部分泛型时如何自动推断Accessor对应参数类型?

解决表格列配置中根据Accessor自动推断Value类型的问题

要实现仅传入Row泛型时自动根据accessor键推断对应value类型,同时保留手动指定accessor类型的能力,可以通过调整TypeScript泛型的定义方式来实现,以下是两种可行方案:

方案1:优化泛型类型定义

通过给泛型参数设置默认值并利用联合类型自动缩小范围,让TypeScript在仅传入Row时自动根据accessor的具体值推断value类型:

// 定义ColumnConfig泛型,K默认是Row的所有键,支持手动指定
type ColumnConfig<Row, K extends keyof Row = keyof Row> = {
  accessor: K;
  render: (value: Row[K]) => React.ReactNode;
};

// 示例Row类型
interface User {
  id: number;
  name: string;
  age: number;
}

// 场景1:仅传入Row,自动推断value类型
const nameColumn: ColumnConfig<User> = {
  accessor: 'name',
  render: (value) => {
    // value自动推断为string
    return <span>{value.toUpperCase()}</span>;
  }
};

// 场景2:手动指定accessor类型(保留原有能力)
const idColumn: ColumnConfig<User, 'id'> = {
  accessor: 'id',
  render: (value) => {
    // value类型为number
    return value.toString();
  }
};

原理:当仅传入Row时,K默认是keyof Row(所有键的联合类型),但当你指定具体的accessor值时,TypeScript会自动将K缩小为该键的具体类型,从而让Row[K]精准对应到该键的值类型。

方案2:使用创建函数优化推断体验

如果觉得直接使用类型定义的推断不够直观,可以封装一个创建列的函数,利用函数泛型的自动推断特性,进一步简化使用:

type ColumnConfig<Row, K extends keyof Row> = {
  accessor: K;
  render: (value: Row[K]) => React.ReactNode;
};

function createColumn<Row, K extends keyof Row>(
  config: ColumnConfig<Row, K>
): ColumnConfig<Row, K> {
  return config;
}

// 使用示例
const ageColumn = createColumn<User>({
  accessor: 'age',
  render: (value) => {
    // value自动推断为number
    return `${value}岁`;
  }
});

// 手动指定accessor类型的场景依然支持
const idColumn = createColumn<User, 'id'>({
  accessor: 'id',
  render: (value) => value.toString()
});

这种方式下,函数会自动根据你传入的accessor值推断K的类型,无需手动指定,同时保留了手动指定K的灵活性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:18:16