强制属性的类型作为typescript中的排序依据

5vf7fwbs  于 2023-02-10  发布在  TypeScript
关注(0)|答案(1)|浏览(107)

我想在typerscript中通过数值属性对对象数组进行排序。
要做到这一点,我有下面的代码。它有一个问题,它不强制在Tprop键的值必须是数字。当然,我可以只在运行时检查arr中的任何值的类型,但我想知道如何在编译时通过使用typescript强制这一点。

function sortByProperty<T>(arr : T[], prop : keyof T) : T[] {
    return arr.sort((a, b) => a[prop] - b[prop]);
}
jobtbby3

jobtbby31#

简单的解决方案如下所示:

function sortByProperty<T extends Record<K, number>, K extends PropertyKey>(
  arr: T[],
  prop: K & keyof T
): T[] {
  return arr.sort((a, b) => a[prop] - b[prop]);
}

我们将prop的类型存储在一个新的泛型类型K中,并强制T必须是一个对象类型,其中属性K的类型是number
如果我们选择的属性名与number属性不对应,则会导致编译时错误。

// valid
sortByProperty([{
    a: "",
    b: "",
    c: 0
}], "c")

// Error: Type 'string' is not assignable to type 'number'
sortByProperty([{
    a: "",
    b: "",
    c: 0
}], "a")

Playground

相关问题