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

如何让泛型函数scanDb的返回类型结合泛型与入参数组值?

问题描述

我定义了如下类型:

type TableItem = {
  name: 'foo',
  address: 'bar',
}

我希望调用泛型函数时传入该泛型与字符串数组:

scanDb<TableItem>('myTableName', ['address'])

能否让该函数的返回类型结合泛型与数组中的值,即返回类型为:

Pick<TableItem, 'address'>[]

该函数的逻辑如下:

function scanDb<Item>(tableName, onlyAttr) {
  // 执行操作...
  // 返回 Pick<Item, UnionOfOnlyAttr>[]
}
解决方案

可以实现,核心是让TypeScript捕获到数组参数里的具体键名,而不是把它当成普通的string[]。修改后的函数类型定义如下:

type TableItem = {
  name: 'foo',
  address: 'bar',
}

function scanDb<Item, K extends keyof Item>(
  tableName: string,
  onlyAttr: K[]
): Pick<Item, K>[] {
  // 编写业务逻辑,比如模拟返回数据
  return [] as Pick<Item, K>[];
}

// 调用示例,此时返回类型自动推导为 Pick<TableItem, 'address'>[]
const result = scanDb<TableItem>('myTableName', ['address']);

关键说明

  • 新增泛型K extends keyof Item,约束onlyAttr必须是Item类型的键组成的数组,TypeScript会自动推断出K的具体值(比如这里的'address')。
  • 返回类型直接指定为Pick<Item, K>[],就能实现根据传入的数组元素动态生成返回类型的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:52:02