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

如何声明TypeScript的findOne函数,实现按筛选返回对象属性子集?

问题场景

请参考以下代码:

interface IEmployee {
    ID: string
    Employee: string
    Phone: number
    Town: string
    Email: string
    Name: string
}

// 应包含IEmployee的所有属性 
let allProps = findOne<IEmployee>("ID = 1234234")

// 类型应为Pick<IEmployee, "Email"| "Phone">  
let picked = findOne<IEmployee>("ID = 1234234", ["Email", "Phone"])

如何声明findOne函数?能否在保持上述调用代码不变的前提下实现该功能?

可能的解决方案

数组参数方式(首选,但无法生效)

以下实现无法生效,因为typeof fields[number]的类型被推断为Array<keyof T>,TypeScript无法识别出具体的键名集合,导致返回类型无法精准匹配:

function findOne<T>(filter: string, fields: Array<keyof T> =[]): Pick<T,typeof fields[number]> {
    return db.select(filter, fields)
}

添加第二个泛型参数(可生效)

该方案可以实现需求,但可读性较差,需要额外定义常量和类型:

function select<T, K extends Partial<T> = T>(filter: string, fields = Array<keyof K>): K {
    return db.select(filter, fields)
}

const props = ["Email", "Phone"] as const
type propsType = Pick<IEmployee, typeof props[number]>

let allProps = select<IEmployee>("Employee: 1234234")
let picked = select<IEmployee, propsType>("Employee: 1234234")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:47:24