Typescript generic function. How use with other types?
Нет, проблем тут куча. 

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

И везде по коду массив — это не Т, а Т[]