首页 > 解决方案 > 打字稿函数重载“没有重载匹配此调用”

问题描述

我实际上认为这是一个错误,但我想我会问。我有一个功能。如果传递一个数字,我想执行一个返回两个对象的操作。如果它收到两个数字,我想返回一个对象。现在看起来像这样:

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

标签: typescript

解决方案


导致您的错误的行是这一行:

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

推荐阅读