首页 > 解决方案 > TypeScript 无法选择正确的函数签名

问题描述

我有一个用 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作品,但是使用thingArrthrows Expected 2 arguments 调用它,但得到 3.ts(2554)

为什么?显然,由于thingArris 不是 type number[],TypeScript 应该尝试使用具有三个参数的第二个签名调用该函数。

标签: typescriptoverloadingsignature

解决方案


没关系,我明白了。结果我需要为我想要的附加签名指定另一个重载。现在我得到了:

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 {
    ...
}

推荐阅读