TypeScript 无法 select 更正函数签名
TypeScript fails to select correct function signature
我有一个用 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
调用它会抛出 预期的 2 个参数,但得到 3.ts(2554) .
为什么?显然,由于 thingArr
不是 number[]
类型,TypeScript 应该尝试使用具有三个参数的第二个签名调用函数。
没关系,我明白了。结果我需要为我想要的附加签名指定另一个重载。现在我得到了:
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 {
...
}
我有一个用 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
调用它会抛出 预期的 2 个参数,但得到 3.ts(2554) .
为什么?显然,由于 thingArr
不是 number[]
类型,TypeScript 应该尝试使用具有三个参数的第二个签名调用函数。
没关系,我明白了。结果我需要为我想要的附加签名指定另一个重载。现在我得到了:
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 {
...
}