首页 > 关于typescript重载的

关于typescript重载的

我在官方文档中看到重载这一节,请问这里的重载是不是显得多余了
这个是一般的实现

这个是typescript为同一个函数提供多个函数类型定义

完全就是多了两行声明,看不出有什么好处来


重载本身是个很好的概念,在静态语言中应用非常广泛。

TypeScript 是想把 JavaScript 静态化,通过一些静态检查提前发现错误。不过 TypeScript 是 JavaScript 的超集,要兼容动态的 JavaScript,所以所谓的静态化都是形式上的。TypeScript 的重载就是其中一种。

注意到 TypeScript 非常强调接口的概念,所以这个问题就好理解了

function pickCard(x),这样的定义,就算有自动完成的参数提示,你明白它需要什么样的参数吗?

但下面这样定义你就清楚了

function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };

这两个重载说明,你可以传入一个 suit,它把对应的编号(或ID)返回出来;也可以传入一个编号,把对应的 suit 返回出来。就这两种调用形式。

而至于后面的 function pickCard(x): any,严格的说是 function pickCard(x: any): any,是具体的实现。也就是说,具体的实现还是动态实现的,需要在代码里去检查参数 x,并根据具体的情况返回。但这个实现是调用者写程序的时候,提示中不会显示出来的,提示中只会显示出来前面的重载申明。最终 tsc 编译成 javascript 的时候也会对调用的参数和返回值类型进行检查,以避免出现调用错误。

总结一下就是,TypeScript 的重载是为了给调用者看,方便调用者知道该怎么调用(同时 tsc 也会进行静态检查以避免错误的调用)。


首先重载并不多余 是一个很好的功能 其目的就是为了用相同的方法名实现不同但类似的功能
重载是指:在同一个类中,方法名称相同,但参数类型类型顺序参数个数不同,与返回值无关

写过后端的应该都知道这个 TypeScript 我没用过 我拿 C# 来举例子吧

先截一个微软设计的 File 类中的静态方法

File.ReadAllText 方法是读取文件中的所有文本
有一个重载,在这里重载的目的是为了程序员调用方便
如果我调用 File.ReadAllText("文件路径"); 则会调用第一个方法的实现,那么 Encoding 应该为默认值
如果我调用 File.ReadAllText("文件路径", Encoding.UTF8); 则会调用第二个方法,那么 EncodingUTF8

这里相当于实现了一个默认参数值的功能
那么public static string ReadAllText( string path );的实现应当为:

public static string ReadAllText( string path )
{
    // 调用另一个重载方法实现这个重载
    ReadAllText(path, Encoding.Default);
}

如果只是为了方便传参数重载应遵循参数少的调用参数多的(最终实现的)那个方法


有助于IDE的代码提示,以及返回值的类型约束

【热门文章】
【热门文章】