TypeScript`groupBy`typings

TypeScript`groupBy`typings,typescript,generics,Typescript,Generics,我想写一个groupBy函数,到目前为止,类型系统对我的工作不太满意 export function group< T extends object, K extends (keyof T & string), R = T[K] extends string ? string : never >( data: T[], groupBy: keyof T ): { [group: R]: T[] } 然而,R都是never,而K是“na

我想写一个
groupBy
函数,到目前为止,类型系统对我的工作不太满意

export function group<
    T extends object,
    K extends (keyof T & string),
    R = T[K] extends string ? string : never
>(
    data: T[],
    groupBy: keyof T
): { [group: R]: T[] }
然而,
R
都是
never
,而
K
“name”|“age”


我必须使用
group
手动缩小类型参数的范围,使
R
成为
string
索引签名必须是
string
number
。没有联合类型,没有泛型类型除了
string
number
之外,没有其他操作

如果您使用两个函数签名,一个只接受
字符串
键,另一个只接受
数字
键,我们仍然可以实现您想要的行为:

export declare function group<T extends Record<K, string>, K extends string>(data: T[], groupBy: K): { [group: number]: T[] }
export declare function group<T extends Record<K, number>, K extends string>(data: T[], groupBy: K): { [group: string]: T[] }


let groupByString = group([{ name: 'Johnny Appleseed', age: 17 }], 'name') 
let groupByNumber = group([{ name: 'Johnny Appleseed', age: 17 }], 'age')
导出声明函数组(数据:T[],groupBy:K):{[group:number]:T[]}
导出声明函数组(数据:T[],groupBy:K):{[group:string]:T[]}
让groupByString=group([{name:'Johnny Appleseed',年龄:17}],'name')
让groupByNumber=group([{name:'Johnny Appleseed',age:17}],'age')
export declare function group<T extends Record<K, string>, K extends string>(data: T[], groupBy: K): { [group: number]: T[] }
export declare function group<T extends Record<K, number>, K extends string>(data: T[], groupBy: K): { [group: string]: T[] }


let groupByString = group([{ name: 'Johnny Appleseed', age: 17 }], 'name') 
let groupByNumber = group([{ name: 'Johnny Appleseed', age: 17 }], 'age')