Я хочу отсортировать массив объектов по числовому свойству в typerscript.
Для этого у меня есть код ниже. У этого есть проблема, заключающаяся в том, что он не обеспечивает, чтобы значение в ключе prop
T
должно быть числовым. Конечно, я мог бы просто проверить это во время выполнения, проверив тип любого из значений в arr
, но я хотел бы знать, как обеспечить это во время компиляции с помощью машинописного текста.
function sortByProperty<T>(arr : T[], prop : keyof T) : T[] {
return arr.sort((a, b) => a[prop] - b[prop]);
}
Простое решение будет выглядеть так:
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")