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)
所以我们可以这样做:
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)