Нет, проблем тут куча.
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 надо указать конкретные типы с которыми предполагается работать, и в самой функции сортировки их учесть.