我想在私有变量上做简单的get / set方法,所以我做
_Var1:number = 0;
Var1():number
{
return this._Var1;
}
Var1(num:number)
{
this._Var1 = num;
}
这会引发编译器错误。不带参数的方法和带一个参数的方法可以共享相同的名称吗?
答案 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
是泛型函数声明。有必要。它上面的行是重载的声明。