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

如何在TypeScript中基于对象数组属性值定义返回类型?

在TypeScript中基于对象嵌套数组的属性值定义函数返回类型

当然可以实现,核心是利用泛型+索引访问类型来捕获数组中name属性的具体字面量类型,而不是使用宽泛的string类型。以下是具体实现方案:

核心实现代码

// 泛型函数:通过泛型T保留传入table的具体类型信息
const fn = <T extends { columns: { name: string }[] }>(table: T): Record<T['columns'][number]['name'], any> => {
  // 示例逻辑:根据columns生成结果对象
  return table.columns.reduce((acc, column) => {
    acc[column.name] = /* 替换为你的业务逻辑值 */ null;
    return acc;
  }, {} as Record<T['columns'][number]['name'], any>);
};

// 测试用例:TypeScript会自动推断columns中name的具体字面量类型
const table = { columns: [{ name: 'col1' }, { name: 'col2' }] };

const result = fn(table);
result.col1; // ✅ 正常访问,类型为any
result.col2; // ✅ 正常访问,类型为any
result.col3; // ❌ 类型报错:不存在该属性

关键知识点解析

  1. 泛型约束:T extends { columns: { name: string }[] } 确保传入的参数符合结构要求,同时让TypeScript保留T的具体类型细节(包括columns数组中每个元素的name字面量)。
  2. 索引访问类型:T['columns'][number]['name'] 是核心逻辑:
    • T['columns']:获取T类型中columns属性的类型;
    • [number]:提取数组的元素类型;
    • ['name']:获取元素类型中name属性的类型,最终得到所有name值的联合类型(比如'col1' | 'col2')。
  3. 返回类型:用上述联合类型作为Record的键类型,值类型可以根据业务需求替换为更具体的类型(比如string、number或自定义类型)。

注意事项

如果显式给table指定了宽泛的Table类型(比如const table: Table = { ... }),TypeScript会丢失name的具体字面量信息,导致返回类型退化为Record<string, any>。因此建议让TypeScript自动推断table的具体类型,或者使用泛型版Table类型:

// 泛型版Table类型
type Table<T extends string = string> = { columns: { name: T }[] };

// 对应泛型函数写法
const fn = <T extends string>(table: Table<T>): Record<T, any> => {
  // 逻辑同上
};

// 使用时可以显式指定泛型参数(也可省略让TS自动推断)
const table: Table<'col1' | 'col2'> = { columns: [{ name: 'col1' }, { name: 'col2' }] };

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:24:59