Проблема в том, что перегрузка реализации (т. Е. Последняя) не вызывается напрямую, поэтому при рекурсивном вызове функции типы должны быть совместимы с одной из двух перегрузок, а объединение несовместимо с(машинопись не будет пытаться объединить подписи, чтобы разрешить передачу профсоюзов)
Самое простое решение в такой ситуации - дублировать сигнатуру реализации:
export function select(
array: Float32Array,
first: number,
nth: number,
last: number,
comp: (a: number, b: number) => boolean,
): void;
export function select<T>(
array: T[],
first: number,
nth: number,
last: number,
comp: (a: T, b: T) => boolean,
): void;
export function select<T>(
array: Float32Array | T[],
first: number,
nth: number,
last: number,
comp: (a: number | T, b: number | T) => boolean,
): void;
export function select<T>(
array: Float32Array | T[],
first: number,
nth: number,
last: number,
comp: (a: number | T, b: number | T) => boolean,
): void {
// Implementation of Floyd-Rivest algorithm
// Some code
let newFirst = 0
let newLast = 0
select(array, newFirst, nth, newLast, comp);
// Some code
}
Другое решение будетиспользовать тип, который является более общим и применимым для обоих типов массивов, как предлагается в комментариях.