带箭头功能的打字稿重载方法

Jem*_*han 5 overloading typescript arrow-functions

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

foo(args: string): string
    foo(args: number): number
    foo(args: string | number): string | number {
        if (typeof args === "string") {
            return "string"
        }
        return 1
    }
Run Code Online (Sandbox Code Playgroud)

试过这个但不工作

foo: {
    (args: string): string;
    (args: number): number;
} = (args: string | number): string | number => {
    if (typeof args === "string") {
      return "string"
    }
    return 1
}
Run Code Online (Sandbox Code Playgroud)

art*_*tem 6

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

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;
    }    
}
Run Code Online (Sandbox Code Playgroud)

因此,这并不比仅仅将实现声明为 return 更好any,就像文档示例中所做的那样:

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


a b*_*ver 6

箭头函数不支持重载。从语言规范

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

当你写

foo: {
  (args: string): string;
  (args: number): number;
}
Run Code Online (Sandbox Code Playgroud)

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

(args: string | number): string | number =>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 但是`foo`的可调用签名与重载的工作方式相同——当你用`string`调用它时,编译器将返回类型推断为字符串,当你用`number`调用它时,返回类型是数字。 (2认同)
  • @artem 就像观察者效应:如果你声明它,它是“字符串和数字”,但如果你使用它,它是“字符串”或“数字”;)不幸的是,这个构造及其含义在规范中没有解释。但是是的:效果是一样的。 (2认同)