Нет, проблем тут куча.
T extends [], K extends keyof T
-
K
тут что-то производное от
number
, потому что ключи(keyof) массива([]) - только цифры.
let resultSort: T = arr;
- бессмысленно, так как
arr.sort
в любом случае меняет исходный массив.
a[propertyName].toLowerCase()
- упадёт если
propertyName
будет
year
, т.к. Number не имеет метода
toLowerCase
.
...
В итоге функция должна выглядеть как-то так:
function sortArray<T extends {[key: string]: unknown}, K extends keyof T> (originArr: T[], propertyName: K, cb: (a: T[]) => T[]): T[] {
let arr: T[] = JSON.parse(JSON.stringify(originArr)); //deep copy array
arr.sort((a, b) => {
let nameA = String(a[propertyName]).toLowerCase(),
nameB = String(b[propertyName]).toLowerCase();
if (nameA < nameB)
return -1;
if (nameA > nameB)
return 1;
return 0;
});
return cb(arr);
}
Можно не приводить строго к
String
, но тогда вместо
unknown
надо указать конкретные типы с которыми предполагается работать, и в самой функции сортировки их учесть.