我在官方文档中看到重载这一节,请问这里的重载是不是显得多余了
这个是一般的实现
这个是typescript为同一个函数提供多个函数类型定义
完全就是多了两行声明,看不出有什么好处来
我在官方文档中看到重载这一节,请问这里的重载是不是显得多余了
这个是一般的实现
这个是typescript为同一个函数提供多个函数类型定义
完全就是多了两行声明,看不出有什么好处来
首先重载并不多余 是一个很好的功能 其目的就是为了用相同的方法名实现不同但类似的功能
重载是指:在同一个类中,方法名称相同,但参数类型、类型顺序、参数个数不同,与返回值无关
写过后端的应该都知道这个 TypeScript
我没用过 我拿 C#
来举例子吧
先截一个微软设计的 File
类中的静态方法
File.ReadAllText
方法是读取文件中的所有文本
有一个重载,在这里重载的目的是为了程序员调用方便
如果我调用 File.ReadAllText("文件路径");
则会调用第一个方法的实现,那么 Encoding
应该为默认值
如果我调用 File.ReadAllText("文件路径", Encoding.UTF8);
则会调用第二个方法,那么 Encoding
为 UTF8
这里相当于实现了一个默认参数值的功能
那么public static string ReadAllText( string path );
的实现应当为:
public static string ReadAllText( string path )
{
// 调用另一个重载方法实现这个重载
ReadAllText(path, Encoding.Default);
}
如果只是为了方便传参数重载应遵循参数少的调用参数多的(最终实现的)那个方法
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
重载本身是个很好的概念,在静态语言中应用非常广泛。
TypeScript 是想把 JavaScript 静态化,通过一些静态检查提前发现错误。不过 TypeScript 是 JavaScript 的超集,要兼容动态的 JavaScript,所以所谓的静态化都是形式上的。TypeScript 的重载就是其中一种。
注意到 TypeScript 非常强调接口的概念,所以这个问题就好理解了
function pickCard(x)
,这样的定义,就算有自动完成的参数提示,你明白它需要什么样的参数吗?但下面这样定义你就清楚了
这两个重载说明,你可以传入一个
suit
,它把对应的编号(或ID)返回出来;也可以传入一个编号,把对应的suit
返回出来。就这两种调用形式。而至于后面的
function pickCard(x): any
,严格的说是function pickCard(x: any): any
,是具体的实现。也就是说,具体的实现还是动态实现的,需要在代码里去检查参数 x,并根据具体的情况返回。但这个实现是调用者写程序的时候,提示中不会显示出来的,提示中只会显示出来前面的重载申明。最终 tsc 编译成 javascript 的时候也会对调用的参数和返回值类型进行检查,以避免出现调用错误。总结一下就是,TypeScript 的重载是为了给调用者看,方便调用者知道该怎么调用(同时 tsc 也会进行静态检查以避免错误的调用)。