带箭头功能的打字稿重载方法
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
}
由于我不完全理解的原因,实现的 return 类型应该是交集,而不是并集:
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;
}
}
所以这并不比将实现声明为 return any
更好,就像他们在 documentation examples:
中所做的那样
class B {
foo: {
(args: string): string;
(args: number): number;
} = (args: string | number): any => {
if (typeof args === "string") {
return "string";
}
return 1;
}
}
箭头函数不支持重载。来自 language specification:
The descriptions of function declarations provided in chapter 6 apply to arrow functions as well, except that arrow functions do not support overloading.
写的时候
foo: {
(args: string): string;
(args: number): number;
}
那你就不要超载了。您实际上说 foo
是一个可以采用其中一种形式(或者两种形式)的函数。箭头函数
(args: string | number): string | number =>
违反了该限制,因为它是一个函数(不是重载函数),并且 string | number
意味着您可以 return 需要字符串时的数字。
正如 artem 已经提出的那样,将 return 类型更改为 any
或交叉类型可以解决问题。但这与重载不同,因为编译器不会在签名之间进行选择。你实际上只有一个:箭头函数。
有人知道如何在箭头函数上使用方法重载吗?
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
}
由于我不完全理解的原因,实现的 return 类型应该是交集,而不是并集:
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;
}
}
所以这并不比将实现声明为 return any
更好,就像他们在 documentation examples:
class B {
foo: {
(args: string): string;
(args: number): number;
} = (args: string | number): any => {
if (typeof args === "string") {
return "string";
}
return 1;
}
}
箭头函数不支持重载。来自 language specification:
The descriptions of function declarations provided in chapter 6 apply to arrow functions as well, except that arrow functions do not support overloading.
写的时候
foo: {
(args: string): string;
(args: number): number;
}
那你就不要超载了。您实际上说 foo
是一个可以采用其中一种形式(或者两种形式)的函数。箭头函数
(args: string | number): string | number =>
违反了该限制,因为它是一个函数(不是重载函数),并且 string | number
意味着您可以 return 需要字符串时的数字。
正如 artem 已经提出的那样,将 return 类型更改为 any
或交叉类型可以解决问题。但这与重载不同,因为编译器不会在签名之间进行选择。你实际上只有一个:箭头函数。