TypeScript的函数重载

5 浏览
0 Comments

TypeScript的函数重载

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";
     }        
}

,我会收到编译器错误,指示重复标识符,即使函数参数是不同类型的。即使我向第二个createFeatureLayer函数添加额外的参数,我仍然会收到编译器错误。请提供想法。

admin 更改状态以发布 2023年5月21日
0
0 Comments

这可能是因为,当这两个函数都被编译为JavaScript时,它们的签名完全相同。由于JavaScript没有类型,我们最终会创建两个使用相同数量参数的函数。因此,TypeScript限制了我们创建这样的函数。\n\nTypeScript支持基于参数数量的重载,但如果我们将其与OO语言进行比较,需要遵循一些不同的步骤。在回答另一个SO问题时,有人用一个很好的例子解释了它:Method overloading?。\n\n基本上,我们只是创建了一个函数和一些声明,以便TypeScript不会产生编译错误。当这段代码被编译为JavaScript时,只有具体的函数才会可见。由于JavaScript函数可以通过传递多个参数来调用,因此它可以正常工作。

0
0 Comments

在TypeScript中进行重载时,您只能有一个带有多个签名的实现。

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

TypeScript仅将三个重载识别为方法调用可能的签名,而不是实际实现。实现签名必须与所有重载兼容。

在您的情况下,我个人会使用两个具有不同名称的方法,因为参数中没有足够的共性,这使得方法体很可能需要有很多“ifs”来决定要执行什么操作。

0