为了账号安全,请及时绑定邮箱和手机立即绑定

TypeScript函数重载

/ 猿问

TypeScript函数重载

慕莱坞5435954 2019-12-11 13:09:26

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函数添加了一个附加参数,我仍然会遇到编译器错误。请给我个主意。


查看完整描述

3 回答

?
斯蒂芬大帝

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


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


基本上,我们正在做的是,我们只创建一个函数和许多声明,以使TypeScript不会产生编译错误。当此代码编译为JavaScript时,将仅可见具体功能。由于可以通过传递多个参数来调用JavaScript函数,因此它可以正常工作。



查看完整回答
反对 2019-12-12
?
慕村9548890

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


class Foo {

    myMethod(a: string);

    myMethod(a: number);

    myMethod(a: number, b: string);

    myMethod(a: any, b?: string) {

        alert(a.toString());

    }

}

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


在您的情况下,我个人会使用两种名称不同的方法,因为参数没有足够的通用性,这使得方法主体可能需要大量的“如果”来决定要做什么。


TypeScript 1.4

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


myMethod(a: string | number, b?: string) {

    alert(a.toString());

}

类型a为“ string或者number”。



查看完整回答
反对 2019-12-12
?
胡子哥哥

您可以通过将函数声明为具有多个调用签名的类型来声明重载函数:


interface IFoo

{

    bar: {

        (s: string): number;

        (n: number): string;

    }

}

然后是以下内容:


var foo1: IFoo = ...;


var n: number = foo1.bar('baz');     // OK

var s: string = foo1.bar(123);       // OK

var a: number[] = foo1.bar([1,2,3]); // ERROR

函数的实际定义必须是单数,并在内部对其参数执行适当的分派。


例如,使用一个类(可以实现IFoo,但不一定要实现):


class Foo

{

    public bar(s: string): number;

    public bar(n: number): string;

    public bar(arg: any): any 

    {

        if (typeof(arg) === 'number')

            return arg.toString();

        if (typeof(arg) === 'string')

            return arg.length;

    }

}

这里有趣的是,any表单被更具体地键入的替代隐藏。


var foo2: new Foo();


var n: number = foo2.bar('baz');     // OK

var s: string = foo2.bar(123);       // OK

var a: number[] = foo2.bar([1,2,3]); // ERROR



查看完整回答
反对 2019-12-12

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信