typescript - 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
作品,但是使用thingArr
throws Expected 2 arguments 调用它,但得到 3.ts(2554)。
为什么?显然,由于thingArr
is 不是 type 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 {
...
}
推荐阅读
- automated-tests - Katalon - 如何将 GlobalVariable 分配给测试用例变量默认值?
- javascript - 防止在自定义日期选择器中手动输入
- azure - 如何使用基于 Azure 应用程序网关路径的路由规则选择特定的后端 VM
- reactjs - 如何在 localStorage 中保存密钥以便稍后在 ReactJS 中返回页面时检索
- sql - 我如何打印一行 x 次,其中 x 是该行中的一个值?
- random-forest - R 包 randomforestsrc 中的 rfsrc 执行多少个引导程序?
- typescript - 如何在 redux 中使用 react-native 编写 POST 方法?
- html - 如果需要,截断最后一个元素的文本
- linux - 执行 yum 命令时终端挂起
- javascript - 使用 Parse.Query 获取作者用户 ID,而不是当前用户