方法超载对我不起作用

时间:2013-08-11 04:54:30

标签: typescript

我想在私有变量上做简单的get / set方法,所以我做

_Var1:number = 0;

Var1():number
{
   return this._Var1;
}

Var1(num:number)
{
   this._Var1 = num;
}

这会引发编译器错误。不带参数的方法和带一个参数的方法可以共享相同的名称吗?

3 个答案:

答案 0 :(得分:4)

你去吧

    Var1(input?:number):number
    {
        if(typeof input != typeof 123)
            return this._Var1;
        else
            return this._Var1 = input;
    }

但是,如果您对过载签名感到好奇,则需要执行以下操作:

class Foo{

    _Var1:number = 0;

    // Sample of overload signatures
    Var1():number
    Var1(input:number):number
    Var1(input?:any):number // The last signature Must be super set of all previous signatures. 
    {
        if(typeof input != typeof 123)
            return this._Var1;
        else
            return this._Var1 = input;
    }
}

更多

关于函数重载的文档:https://basarat.gitbooks.io/typescript/content/docs/types/functions.html#overloading

答案 1 :(得分:1)

如果您的目标是ECMAScript 5或更高版本,那么您的代码只需要get和set关键字:

_Var1:number = 0;

get Var1():number
{
   return this._Var1;
}

set Var1(num:number)
{
    this._Var1 = num;
}

如果你想定位旧版本,我建议使用getVar1和setVar1方法名称而不是重载,这会强制你检查输入。这两种方法非常简洁。

或者,您可以利用一个巧妙的技巧,允许您将运行时变量用作默认参数:

Var1(num: number = this._Var1) {
    return this._Var1 = num;
}

我仍然喜欢名为get ...和set ...的方法,原因如下:为此生成的JavaScript看起来很糟糕,因为它将包含对于gets不必要的代码。它也会在您设置时返回一个值,这不是正常的约定。

答案 2 :(得分:1)

您需要一个函数重载的通用实现:

Var1(): number;
Var1(num: number): void;
Var1(num?: number): any
{
    if (num === undefined) return this._Var1;
    this._Var1 = num;
}

重载的是函数的声明,而不是它的实现。最后一行:Var1(num?: number): any是泛型函数声明。有必要。它上面的行是重载的声明。