一种带箭头功能 typescript 重载方法

wz3gfoph  于 2023-02-25  发布在  TypeScript
关注(0)|答案(2)|浏览(157)

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

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
}
hpxqektj

hpxqektj1#

箭头函数不支持重载。根据语言规范:
第6章提供的函数声明的描述也适用于箭头函数,只是箭头函数不支持重载。
当你写作的时候

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

那么你就不会重载,你实际上是说foo是一个可以采用这两种形式之一(或者两种形式都有)的函数。

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

违反了这个限制,因为它是单个函数(不是重载函数),而string | number意味着当需要字符串时可以返回一个数字。
正如artem所建议的,将返回类型改为any或交集类型可以解决问题,但这与重载不同,因为编译器不会在签名之间进行选择,实际上只有一个签名:箭头函数的函数名。

5sxhfpxr

5sxhfpxr2#

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

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好多少,就像文档示例中所做的那样:

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

相关问题