[英]typescript overload method with arrow function
有人知道如何在箭头函数上使用方法重载吗?
foo(args: string): string
foo(args: number): number
foo(args: string | number): string | number {
if (typeof args === "string") {
return "string"
}
return 1
}
试过这个但不工作
foo: {
(args: string): string;
(args: number): number;
} = (args: string | number): string | number => {
if (typeof args === "string") {
return "string"
}
return 1
}
箭头函数不支持重载。 从语言规范:
第 6 章中提供的函数声明的描述也适用于箭头函数,只是箭头函数不支持重载。
当你写
foo: {
(args: string): string;
(args: number): number;
}
那么你就不会超载。 您实际上是说foo
是一个可以采用这些形式之一(或者更确切地说是两种形式)的函数。 箭头函数
(args: string | number): string | number =>
违反了该限制,因为它是单个函数(不是重载函数)和string | number
string | number
意味着您可以在需要字符串时返回一个数字。
正如 artem 已经提出的,将返回类型更改为any
或交叉类型可以解决问题。 但这与重载不同,因为编译器不会在签名之间进行选择。 你实际上只有一个:箭头函数。
由于我不完全理解的原因,实现的返回类型预计是交集,而不是联合:
class B {
foo: {
(args: string): string;
(args: number): number;
} = (args: string | number): string & number => {
if (typeof args === "string") {
return "string" as string & number;
}
return 1 as string & number;
}
}
所以这并不比仅仅声明实现返回any
更好,就像他们在文档示例中所做的那样:
class B {
foo: {
(args: string): string;
(args: number): number;
} = (args: string | number): any => {
if (typeof args === "string") {
return "string";
}
return 1;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.