打字稿重载箭头功能

WHI*_*LOR 7 typescript

所以我们可以做:

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

我可以使用箭头功能声明并实现它吗?

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

export var myMethodArror = (param: string | number): string | number => {
..
}
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*m96 15

我猜它是在那时和现在之间添加的,因为您现在可以使用接口或类型(无关紧要的,除了关键字以外的相同语法)来添加它。当然也可以作为出口。虽然必须对函数进行命名(我想所有重载函数都必须命名),所以如果要将其用作回调,则必须首先声明它。

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

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

let val = overloadedArrowFunc(4);
Run Code Online (Sandbox Code Playgroud)

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

另外,要为对此提出任何疑问,是的,我已经any在实现中声明了该参数。我也可以将其声明为number|object,但我喜欢这样。就其他重载而言,它更容易扩展,而且更短,据我所知,它实际上不会阻止您的类型检查,因为您的重载签名可以做到这一点。

  • `<any>` 只有在不到一个半小时的情况下才承认失败,对吗?同样的限制似乎仍然适用于我正在做的事情。 (6认同)
  • 此解决方案的缺点是无法在函数体中对返回类型进行类型检查。请参阅[此处](https://www.typescriptlang.org/play/#code/C4TwDgpgBAkg8gNwgJwDYHsCGATKBeKAbwFgAoKCqACjE2UwFsAuKAOwFcGAjFAShY7cUAbQC6AbjKVqtesyjouAKwgBjYPyhd06VBEysxk0gF8yAenNRQkKKoAWagNYB LVgHMFAMyjIIwdmRWa3AIAGcoNzCXbGgvdlZ1F3Rg7WwQSIjWdGAoMHQw6K49agMMg2zgTGAIbF4LKwBBVFRff0Dgm3CoOmg3GuQwtRrsABo2sPZUYDdPNzZOHmQxKAAyLR09AzFxgHD7FwcoCC8vYZckVAyXLig kZAA6MLUUSNz0e4wcWsbkZHRdgAxBKqFjwT5YXAEGh0RgsMqaMrMABUUAEixEojWG10+kMWORVjwAD4iFJKH4AKEoMIAEzjADMojIZlIelyCEwrQIHxQX1i2F+-yBIKoABZEOIGA) (5认同)
  • 这是一个实际的答案。我不同意将名称重新写起来很烦人,但这解释了如何重载箭头函数的签名 (2认同)
  • 这真是太棒了。但是,当我测试类型检查时,将错误的第二个参数与第一个参数匹配时出现错误( `type override = { (first: type1a, secondary: type 1b): any, (first: type2a, secondary: type2b)` 是`最后一个重载出现以下错误:类型'type1a'的参数不能分配给类型'type1b'的参数。`这很令人困惑,它应该是类似`type1a不能与type2b一起使用`。有办法解决这个问题吗? (2认同)
  • 我喜欢这个...但是如何在 IOverload 中调用泛型?我想使用泛型来重载不同类型。我正在尝试不同的方法,但无法获得正确的语法。 (2认同)

wca*_*lon 5

此解决方案基于@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,
});
Run Code Online (Sandbox Code Playgroud)

  • 这看起来很酷。您能否扩展这个答案并解释当所有三个参数都具有不同的泛型类型并且需要您的 T 作为类型参数时它将如何工作? (8认同)

小智 5

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

export let myMethodArror = ((param: string | number): string | number => {
...
}) as ((param: string) => string) & ((param: number) => number)
Run Code Online (Sandbox Code Playgroud)