是否支持函数重载

什么是函数重载

函数重载即允许定义多个同名函数,在调用时,会根据参数情况调用其中的一个函数。比如:

  1. function foo(s: string) { return s + 1 }
  2. function foo(s: int) { return s + 1}
  3. foo("a") // => "a1"
  4. foo(3) // => 4

假如不支持函数重载,一旦需要实现相同相同、但参数不同的函数,就需要取不同的名字。这些名字会增加记忆的负担。
但如果支持函数重载,阅读代码时,无法简单通过函数名确定要调用的函数。

主流语言的支持现状

目前支持函数重载的语言有:C++、Java、C#、Kotlin、Swift。
C、Go和其他脚本语言均不支持函数重载。

可选方案

方案1:支持函数重载(同 C++、Java、C#、Kotlin、Swift)

方案2:支持函数重载,但所有重载添加 partial 修饰符以增加可读性

方案3:不支持函数重载(同 C、Go)

方案4:不支持函数重载,但支持添加重载签名(同 TS)

问题的研究

语言已经支持默认参数、联合类型、变长参数,以上功能组合使用,可以取代多数的函数重载,比如:

  1. function foo(s: int | string, default = 0) {
  2. return s + default
  3. }

但还有若干场景,仍然不如用函数重载更清晰:
1) 函数的返回类型需要根据参数变化。
2) 需要为不同的重载编写不同的文档。

最终决策

暂采纳方案4。