TypeScript函数重载是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (319)

TypeScript语言规范的第6.3节讨论了函数重载,并给出了有关如何实现这个的具体示例。但是,如果我尝试这样:

export class LayerFactory { 

    constructor (public styleFactory: Symbology.StyleFactory) { }

    createFeatureLayer (userContext : Model.UserContext, mapWrapperObj : MapWrapperBase) : any {           
         throw "not implemented";
    }                 

    createFeatureLayer(layerName : string, style : any) : any {
        throw "not implemented";
     }        

}

即使函数参数是不同的类型,我也会得到一个编译器错误,指示重复的标识符。

提问于
用户回答回答于

这可能是因为,当两个函数都编译为JavaScript时,它们的签名完全相同。由于JavaScript没有类型,最终创建了两个采用相同数量参数的函数。所以,TypeScript限制了我们创建这样的功能。

TypeScript支持基于参数数量的重载,但如果我们将其与OO语言进行比较,则要遵循的步骤稍有不同。

我们应该只创建一个函数和一些声明,使得TypeScript不会出编译错误。当这段代码被编译为JavaScript时,只有具体的函数会被看到。由于可以通过传递多个参数来调用JavaScript函数,因此它可以正常工作。

用户回答回答于

当在TypeScript中重载时,只有一个具有多个签名的实现。

class Foo {
    myMethod(a: string);
    myMethod(a: number);
    myMethod(a: number, b: string);
    myMethod(a: any, b?: string) {
        alert(a.toString());
    }
}
 

TypeScript 1.4

从TypeScript 1.4开始,可以使用联合类型删除对重载的需要。例子:

myMethod(a: string | number, b?: string) {
    alert(a.toString());
}

类型a是“ string或者number”。

扫码关注云+社区