TypeScript не может выбрать правильную сигнатуру функции - PullRequest
0 голосов
/ 03 октября 2019

У меня есть функция, написанная на TypeScript, которая выполняет бинарный поиск. Обычно я позволяю ему работать с числовыми массивами, но я хотел сделать его более общим. Вот код, который я получил сейчас:

export function binarySearchLessOrEqual(arr: number[], key: number): number;
export function binarySearchLessOrEqual<T>(arr: T[], key: number, valueGetter?: (x: T) => number): number {
    ...
}

Для универсальной версии требуется третий аргумент valueGetter, который отображает каждое значение из arr в некоторое числовое значение, которое затем используется для двоичного кода. поиск.

Пример моего вызова:

interface Thing {
    x: number
}

let numberArr: [0, 1, 2];
binarySearchLessOrEqual(numberArr, 1);

let thingArr: Thing[] = [{x: 0}, {x: 1}, {x: 2}];
binarySearchLessOrEqual(thingArr, 1, (o) => o.x);

binarySearchLessOrEqual с использованием numberArr работает, как и ожидалось, однако вызов его с thingArr throws Ожидаемые 2 аргумента, нополучил 3.ts (2554) .

Почему? Очевидно, что thingArr не является типом number[], TypeScript должен попытаться вызвать функцию со второй сигнатурой, которая имеет три аргумента.

1 Ответ

0 голосов
/ 03 октября 2019

Неважно, я понял. Оказывается, мне нужно было указать другую перегрузку для дополнительной подписи, которую я хотел. Теперь я получил:

export function binarySearchLessOrEqual(arr: number[], key: number): number;
export function binarySearchLessOrEqual<T>(arr: T[], key: number, valueGetter: (x: T) => number): number;
export function binarySearchLessOrEqual<T>(arr: T[], key: number, valueGetter?: (x: T) => number): number {
    ...
}
...