Typescript 重载箭头函数

Typescript overload arrow functions

所以我们可以这样做:

export function myMethod (param: number) :number
export function myMethod (param: string) :string

export function myMethod (param: string | number): string | number {
  if (typeof param === 'string') {
    return param.toUpperCase()
  } else {
    return param + 1
  }
}

可以用箭头函数声明和实现吗?

export var myMethodArror = (param: string): string
export var myMethodArror = (param: number): number

export var myMethodArror = (param: string | number): string | number => {
..
}

我知道不可能复制变量声明,但我的问题是:是否可以使用箭头表示法重载函数?

重载签名的声明总是

function name(args...): result;

带有 function 关键字和函数名称。

你的语法

var myMethodArror = (param: string): string;

无效。它试图将一些看起来像箭头函数开头的东西分配给一个变量,但该函数没有主体。你会得到错误

'=>' expected

如果你用不同的签名重复这个,那么你也会得到一个重复的 属性 错误,或者可能是错误

Subsequent variable declarations must have the same type.

这不是箭头函数特有的。如果你尝试做

也会出现同样的问题
var myMethodArror = function(param: string): string;

这会产生

'{' expected

因为缺少函数体。

我猜它是在那时和现在之间添加的,因为您现在可以使用接口或类型来完成它(没关系,相同的语法除了关键字)。当然也可以作为出口。但是函数必须命名(我认为所有重载函数都必须命名),所以如果你想将它用作回调,你必须先声明它。

type IOverload = {
    (param: number): number[];
    (param: object): object[];
}

const overloadedArrowFunc: IOverload = (param: any) => {
    return [param, param];
}

let val = overloadedArrowFunc(4);

我更喜欢这样,它减少了重复写作的需要。一遍又一遍写名字很烦人。

此外,为了说明任何与此相关的问题,是的,我已在实现中将参数声明为 any。在当前状态下,这是允许编译所必需的,是的,正如@ford04 指出的那样,您将在函数内部失去类型安全。在涉及函数及其 return 时,打字稿似乎仍然无法正确处理标记的联合。或者你可以有更严格的参数但是你必须将 return 转换为任何。

此解决方案基于@Sam96,但保留了箭头函数代码的完整类型。

type Create = {
  (): Vector<0>;
  <T>(x: T): Vector<T>;
  <T>(x: T, y: T): Vector<T>;
};

const create: Create = <T>(
  x?: T,
  y?: T
) => ({
  x: x ?? 0,
  y: y ?? x ?? 0,
});

您可以使用交集运算符 & 进行重载。

export let myMethodArror = ((param: string | number): string | number => {
...
}) as ((param: string) => string) & ((param: number) => number)