《TypeScript实战指南》—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 中的重载使用率很低,大家更倾向于使用其他方式达到类似的效果,而不是直接使用它。
- 点赞
- 收藏
- 关注作者
评论(0)