如何让泛型函数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
相关产品推荐
相关产品推荐

