《TypeScript实战指南》—2.3.5 重载

举报
华章计算机 发表于 2019/06/16 13:06:35 2019/06/16
【摘要】 本节书摘来自华章计算机《TypeScript实战指南》一书中的第2章,第2.3.5节,作者是胡桓铭。

2.3.5 重载

重载是静态类型语言常见的一种能力,简单说,就是函数或者方法有相同的名称,但是参数列表不相同,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

JavaScript本身是个动态类型语言,所以并没有原生支持的重载,通常情况下,我们通过如下方式实现类似重载的效果。还是用 padLeft 的例子:

function padLeft(value: string, padding: any) {

    if (typeof padding === "number") {

        return Array(padding + 1).join(" ") + value;

    }

    if (typeof padding === "string") {

        return padding + value;

    }

    throw new Error(`Expected string or number, got '${padding}'.`);

}

 

padLeft("Hello world", 4); // "    Hello world"

padLeft 需要根据传入的不同参数类型处理不同的逻辑。TypeScript 中的重载并不支持我们实现多个不同参数的 padLeft 函数,它的语法有一点点怪异,是如下这样的:

function padLeft(value: string, padding: number): string;

function padLeft(value: string, padding: string): string;

 

function padLeft(value: string, padding: any) {

    if (typeof padding === "number") {

        return Array(padding + 1).join(" ") + value;

    }

    if (typeof padding === "string") {

        return padding + value;

    }

    throw new Error(`Expected string or number, got '${padding}'.`);

}

 

padLeft("Hello world", 4); // "    Hello world"

// function padLeft(value: string, padding: number): void (+1 overload)

我们声明了多个不同的 padLeft 函数,最后在一个类型最宽泛的版本中去实现了它,这都是为了能在编译时和代码提示时获得最佳的体验。简洁度并不如联合声明。所以 TypeScript 中的重载使用率很低,大家更倾向于使用其他方式达到类似的效果,而不是直接使用它。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。