如何声明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
相关产品推荐
相关产品推荐

