typescript - 打字稿函数重载“没有重载匹配此调用”
问题描述
我实际上认为这是一个错误,但我想我会问。我有一个功能。如果传递一个数字,我想执行一个返回两个对象的操作。如果它收到两个数字,我想返回一个对象。现在看起来像这样:
function split (splitAt: number | [number, number]): SomeSplittableObject | [SomeSplittableObject, SomeSplittableObject]
但是通过重载我应该能够做到这一点:
function split (splitAt: number): [SomeSplittableObject, SomeSplittableObject]
function split (splitAt: [number, number]): SomeSplittableObject
function split (splitAt: number | [number, number]): SomeSplittableObject | [SomeSplittableObject, SomeSplittableObject] {
// ... Implementation
}
let splitAt: number | [number, number] //... some variable
split(splitAt)
但我收到一个编辑器内错误
No overload matches this call.
Overload 1 of 2, '(splitAt: [number, number]): SomeSplittableObject', gave the following error.
Argument of type 'number | [number, number]' is not assignable to parameter of type '[number, number]'.
Type 'number' is not assignable to type '[number, number]'.
Overload 2 of 2, '(splitAt: number): [SomeSplittableObject, SomeSplittableObject]', gave the following error.
Argument of type 'number | [number, number]' is not assignable to parameter of type 'number'.
Type '[number, number]' is not assignable to type 'number'.
即使我在实现 args 中进行转换,我也会收到splitAt
错误any
解决方案
导致您的错误的行是这一行:
let splitAt: number | [number, number] //... some variable
使用您拥有的重载签名,您是说您有两种形式的 function split
。一个接受一个数字,另一个接受一个包含两个数字的数组。您没有同时采用这两种类型的签名,因此编译器会抱怨。
split(1) // return type is [SomeSplittableObject, SomeSplittableObject]
split([1,2]) // return type is SomeSplittableObject
let splitAt: number | [number, number] //... some variable
split(splitAt) // return type is ???
编辑
请注意,在重载函数时,已实现的函数签名会被重载遮蔽,并且对外部不可见。在上述情况下,您只有 2 个选项。如果要添加输入/输出为“不明确”的第三个选项,则需要将签名添加为重载(为了清楚起见,我在这里使用了较短的类型):
function foo(x: number): Foo;
function foo(x: string): Bar;
// Define an overload in which the inputs and outputs can be either type
function foo(x: string | number): Foo | Bar;
// Function signature is shadowed by overloads defined above.
function foo(x: string | number): Foo | Bar { /* ... */ }
推荐阅读
- android - 如何将数据从服务发送回活动?
- excel - 计算给定单元格中的句子数
- google-apps-script - AppScript 在匹配时删除部分文本
- android - 在集成 Jetpack Compose 时应用插件请求 [id: 'com.android.application'] 发生异常
- javascript - 根据给定日期计算年龄的简单代码
- c# - 动态绑定输入字段 blazor
- php - 我不断收到错误“警告:第 2 行 C:\xampp\htdocs\index.php 中未定义的数组键“用户名””,我不知道该怎么办
- reactjs - Django Rest Framework + Django Channels + Reactjs 可以一起工作吗?如果是这样..我在客户端也需要 Socket.io 吗?
- python - 如何在 vscode 中为输出添加颜色
- python - 在没有警告的情况下替换和填充列