所以我们可以这样做:
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
}
}
我知道不可能复制变量声明,但我的问题是:是否可以使用箭头表示法使函数重载?
答案 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.