Typescript重载箭头函数

时间:2016-08-28 02:55:47

标签: typescript

所以我们可以这样做:

instring = 'Djokovic:Murray:2-6,6-7,7-6,6-3,6-1'

instring_split = instring.split(':')
name1 = instring_split[0]
name2 = instring_split[1]
scores = instring_split[2]
score_pairs = scores.split(',')
namescores = {}
namescores[name1] = {}
namescores[name2] = {}

for i, score_pair in enumerate(score_pairs):
    score_pair_split = score_pair.split('-')
    namescores[name1][str(i)] = int(score_pair_split[0])
    namescores[name2][str(i)] = int(score_pair_split[1])

print(str(namescores))

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

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

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

5 个答案:

答案 0 :(得分:5)

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

 val filename=File(getExternalStorageDirectory()?.toString()+"/test.jpg")
 if (filename != null) {
   val takePictureIntent=Intent(MediaStore.ACTION_IMAGE_CAPTURE)
   takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, filename)
   startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
   }

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

此外,为了开始对此提出的任何疑问,是的,我在实现中将参数声明为override fun onActivityResult(requestCode:Int, resultCode:Int, data:Intent?) { ... val returnedFilename = data?.getData() ... } 。我也可以将其声明为type IOverload = { (param:number):number[]; (param:object):object[]; } const overloadedArrowFunc:IOverload = (param:any) => { return [param,param]; } let val = overloadedArrowFunc(4); ,但我喜欢这样。据我所知,它更容易与其他重载一起扩展,更短,并且据我所知,它实际上不会阻止类型检查,因为重载签名可以做到这一点。

答案 1 :(得分:2)

重载签名的声明总是

function

使用var myMethodArror = (param: string): string; 关键字和函数名称。

您的语法

var myMethodArror = function(param: string): string;

无效。它试图将看起来像箭头函数的开头的东西分配给变量,但该函数没有正文。你会收到错误

  

' = GT;'预期

如果您使用不同的签名重复此操作,那么您还会收到重复的属性错误,或者错误

  

后续变量声明必须具有相同的类型。

这不是箭头功能特有的。如果您尝试

,则会出现同样的问题
default['testcookbook']['testusers']['sudoer_group'] = [

会产生

  

' {'预期

因为缺少函数体。

答案 2 :(得分:2)

此解决方案基于@ 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,
});

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

您可以声明覆盖 interface/type,然后重复声明但使用类型的联合。

type Func = {
  (param: string): string
  (param: number): number
}

type NS = number | string // for non primitive types ->  T & U

export const func: Func = (param: NS): NS => {
  ...
}

检查 demo.