多个呼叫签名在单个对象类型中是否有用?

时间:2015-08-17 09:02:04

标签: typescript

对象类型中可以有多个调用签名

interface MyInterface {
    (x:number, y:number) : number
    (s:string):void
}

这种语言并没有禁止这种情况,但这有用吗?是否可以构造该对象类型的(非空)表达式?

2 个答案:

答案 0 :(得分:2)

  

这种语言并没有禁止这种情况,但这是有用的

用于建模许多 JavaScript库的工作原理。例如。考虑getter / setter定义:

interface GetSet {
    (x:number) : void;
    ():number;
}

var getSet: GetSet; 

getSet(123); // set
var config = getSet(); // get
  

是否可以构造该对象类型的<非空表达式

轻松:

interface GetSet {
    (x:number) : void;
    ():number;
}

var getSet: GetSet; 

getSet(123); // set
var config = getSet(); // get

// SAMPLE
function sampleGetSet(x:number): void;
function sampleGetSet(): number;
function sampleGetSet(x?:number){
    if (x == void 0){
        return 123; // getter
    }
    else {
        var something = x; // setter
    }
}
// Allowed as it matches the signature
getSet = sampleGetSet;

答案 1 :(得分:0)

如果没有真正了解具体案例,有点难以展示如何使用它的例子,但你可以这样:

interface MyInterface {
  (x: number, y: number): number
  (x: string): void
}

enum ActionType {
  T1, T2
}

class SomeClass {
  public handleSomething(action: ActionType, handler: MyInterface): boolean {
    var result: boolean = false;
    switch (action) {
      case ActionType.T1:
        result = handler(1, 2) > 5;
        break;
      case ActionType.T2:
        handler('test');
        result = true;
        break;
    }
    return result;
  }
}

在这种情况下,您的界面只是一个回调签名,允许您使用多个方法调用handler

我不确定你的意思是:&#39;构建该对象类型的表达式&#39;