带箭头函数的typescript重载方法

时间:2018-06-08 03:19:30

标签: typescript overloading arrow-functions

任何人都知道如何在箭头函数上使用方法重载?

foo(args: string): string
    foo(args: number): number
    foo(args: string | number): string | number {
        if (typeof args === "string") {
            return "string"
        }
        return 1
    }

尝试了这个但没有工作

foo: {
    (args: string): string;
    (args: number): number;
} = (args: string | number): string | number => {
    if (typeof args === "string") {
      return "string"
    }
    return 1
}

2 个答案:

答案 0 :(得分:3)

由于我不完全理解的原因,实现的返回类型应该是交集,而不是union:

class B {
    foo: {
        (args: string): string;
        (args: number): number;
    } = (args: string | number): string & number => {
        if (typeof args === "string") {
            return "string" as string & number;
        }
        return 1 as string & number;
    }    
}

因此,仅仅声明实现返回any并不如在documentation examples中那样做:

class B {
    foo: {
        (args: string): string;
        (args: number): number;
    } = (args: string | number): any => {
        if (typeof args === "string") {
            return "string";
        }
        return 1;
    }    
}

答案 1 :(得分:2)

箭头功能不支持重载。来自language specification

  

第6章中提供的函数声明的描述也适用于箭头函数,但箭头函数不支持重载。

写作时

foo: {
  (args: string): string;
  (args: number): number;
}
那么你不会超负荷。实际上你说foo是一个可以采用这些形式之一(或者说两种形式)的函数。箭头功能

(args: string | number): string | number =>

违反了这个限制,因为它是一个单一的函数(不是一个重载的函数)而string | number意味着你可以在预期字符串时返回一个数字。

正如artem已经提出的那样,将返回类型更改为any或交叉类型可以解决问题。但它与重载不同,因为编译器没有在签名之间进行选择。你实际上只有一个:箭头函数。