typescript `groupBy` 打字

标签 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{ [group: R]: T[] }不是 stringnumber .

签名实际上对数据集根本不起作用

group([{ name: 'Johnny Appleseed', age: 17 }], 'name') // R should be string
group([{ name: 'Johnny Appleseed', age: 17 }], 'age') // R should be never

但是,Rnever同时 K"name" | "age"

我必须使用 group<{name: string, age: number}, 'name'> 手动缩小类型参数范围制作Rstring .

最佳答案

索引签名必须是stringnumber。没有联合类型,没有泛型类型,除了 stringnumber 之外什么都做不了。

如果您使用两个函数签名,我们仍然可以实现您想要的行为,一个只接受 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')

关于 typescript `groupBy` 打字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52492978/

相关文章:

angular - 在 Angular 中使用枚举来选择下拉菜单项

css - 在 Angular 中删除或添加类

typescript - 如何让 TypeScript 自动推断 `yield` 调用结果的类型?

angular - 无法获取字符串值的 Observable(angular2/typescript)

c# - 转换为动态类型变量的通用列表

Java DAO 泛型

class - TypeScript - 将类存储为 map 值?

arrays - 采用泛型数组的 Swift 函数

Swift:如何使我的自定义结构 Node<T> 符合 Hashable?

java - 获取一项的 HashMap 中的值的最简单方法是什么?