带有箭头函数的打字稿重载方法
Posted
技术标签:
【中文标题】带有箭头函数的打字稿重载方法【英文标题】:typescript overload method with arrow function 【发布时间】:2018-11-18 01:19:18 【问题描述】:有人知道如何在箭头函数上使用方法重载吗?
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
【问题讨论】:
其实可以支持重载。见***.com/questions/20646171/… 您实际上可以重载箭头函数。见***.com/questions/20646171/… 【参考方案1】:箭头函数不支持重载。来自language specification:
第 6 章中对函数声明的描述也适用于箭头函数,只是箭头函数不支持重载。
当你写作时
foo:
(args: string): string;
(args: number): number;
那么你就不会超载。您实际上说 foo
是一个可以采用其中一种形式(或者更确切地说是两种形式)的函数。箭头函数
(args: string | number): string | number =>
违反了该限制,因为它是单个函数(不是重载函数)并且string | number
意味着您可以在需要字符串时返回一个数字。
正如 artem 已经提出的,将返回类型更改为 any
或交集类型可以解决问题。但这与重载不同,因为编译器不会在签名之间进行选择。你实际上只有一个:箭头函数。
【讨论】:
但是foo
的可调用签名的工作方式与重载相同 - 当您使用 string
调用它时,编译器会将返回类型推断为字符串,而当您使用 number
调用它时,返回类型为数字。
@artem 就像一个观察者效应:如果你声明它是string & number
,但如果你使用它是string
或number
;) 不幸的是,这个构造及其含义在规范中没有解释.但是是的:效果是一样的。【参考方案2】:
由于我不完全理解的原因,实现的返回类型预计是交集,而不是联合:
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;
因此,就像他们在documentation examples 中所做的那样,仅将实现声明为返回any
并没有比这更好:
class B
foo:
(args: string): string;
(args: number): number;
= (args: string | number): any =>
if (typeof args === "string")
return "string";
return 1;
【讨论】:
以上是关于带有箭头函数的打字稿重载方法的主要内容,如果未能解决你的问题,请参考以下文章