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')