带有箭头函数的打字稿重载方法

Posted

技术标签:

【中文标题】带有箭头函数的打字稿重载方法【英文标题】:typescript overload method with arrow function 【发布时间】:2018-11-18 01:19:18 【问题描述】:

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

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

【问题讨论】:

其实可以支持重载。见***.com/questions/20646171/… 您实际上可以重载箭头函数。见***.com/questions/20646171/… 【参考方案1】:

箭头函数不支持重载。来自language specification:

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

当你写作时

foo: 
  (args: string): string;
  (args: number): number;

那么你就不会超载。您实际上说 foo 是一个可以采用其中一种形式(或者更确切地说是两种形式)的函数。箭头函数

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

违反了该限制,因为它是单个函数(不是重载函数)并且string | number 意味着您可以在需要字符串时返回一个数字。

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

【讨论】:

但是 foo 的可调用签名的工作方式与重载相同 - 当您使用 string 调用它时,编译器会将返回类型推断为字符串,而当您使用 number 调用它时,返回类型为数字。 @artem 就像一个观察者效应:如果你声明它是string & number,但如果你使用它是stringnumber ;) 不幸的是,这个构造及其含义在规范中没有解释.但是是的:效果是一样的。【参考方案2】:

由于我不完全理解的原因,实现的返回类型预计是交集,而不是联合:

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;
        

因此,就像他们在documentation examples 中所做的那样,仅将实现声明为返回any 并没有比这更好:

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

【讨论】:

以上是关于带有箭头函数的打字稿重载方法的主要内容,如果未能解决你的问题,请参考以下文章

带有箭头功能的打字稿装饰器

打字稿装饰器和箭头函数

打字稿装饰器不能使用箭头函数

打字稿 - 在箭头(回调)函数中使用它 - 猫鼬

在打字稿中应用箭头函数作为对象属性

在打字稿中实现函数重载