首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >TypeScript函数重载

TypeScript函数重载
EN

Stack Overflow用户
提问于 2012-11-04 03:22:24
回答 3查看 233K关注 0票数 320

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

代码语言:javascript
复制
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";
     }        

}

即使函数参数的类型不同,我也会得到一个编译器错误,指出标识符重复。即使我在第二个createFeatureLayer函数中添加了一个额外的参数,我仍然会得到一个编译器错误。请给我点子。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-04 03:49:30

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

TypeScript支持基于参数数量的重载,但如果我们将其与OO语言进行比较,则需要遵循的步骤略有不同。在回答另一个SO问题时,有人用一个很好的例子解释了它:Method overloading?

基本上,我们正在做的是,我们只创建了一个函数和许多声明,这样TypeScript就不会给出编译错误。当这段代码编译成JavaScript时,具体的函数就可见了。因为可以通过传递多个参数来调用JavaScript函数,所以它可以正常工作。

票数 233
EN

Stack Overflow用户

发布于 2012-11-04 03:50:31

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

代码语言:javascript
复制
class Foo {
    myMethod(a: string);
    myMethod(a: number);
    myMethod(a: number, b: string);
    myMethod(a: any, b?: string) {
        alert(a.toString());
    }
}

只有这三个重载被TypeScript识别为方法调用的可能签名,而不是实际的实现。

在您的例子中,我个人会使用两个不同名称的方法,因为参数中没有足够的通用性,这使得方法体可能需要有很多“if”来决定要做什么。

TypeScript 1.4

从TypeScript 1.4开始,通常可以使用联合类型消除对重载的需求。使用以下命令可以更好地表达上面的示例:

代码语言:javascript
复制
myMethod(a: string | number, b?: string) {
    alert(a.toString());
}

a的类型为“stringnumber”。

票数 264
EN

Stack Overflow用户

发布于 2016-10-03 22:57:19

作为对其他人的提醒,我已经注意到,至少像WebPack为Angular 2编译的TypeScript所显示的那样,您得到的是overWRITTEN方法,而不是overLOADED方法。

代码语言:javascript
复制
myComponent {
  method(): { console.info("no args"); },
  method(arg): { console.info("with arg"); }
}

呼叫:

代码语言:javascript
复制
myComponent.method()

似乎执行带有参数的方法,默默忽略无参数版本,并输出:

代码语言:javascript
复制
with arg
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13212625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档