2013-07-31 53 views
7

我是新来的打字稿,这里是我想要实现的界面;如何在TypeScript接口中实现重写方法?

interface IThing{ 
    name:string; 
    age:number; 
    sayHello:{ 
     (name:string):string; 
     (age:number):number; 
    } 
} 

的sayHello都有两个签名指示过载版本。我只是不知道如何在课堂上实施,有什么帮助?谢谢。

+0

这对我来说看起来不像是有效的TypeScript。你有看过代码示例吗? http://www.typescriptlang.org/Tutorial/ –

+0

有没有错误发生通过IntelSense,我从这里打字稿介绍视频这里的代码片段:http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing -TypeScript –

+3

这是完全有效的TypeScript,这是一个有效的,直接的问题。投票重新打开。 –

回答

8

要实现重载函数,请首先编写想要首先显示的所有重载呼叫签名,然后写入作为所有重载签名超集的实现签名。例如:

class Thing implements IThing { 
    // Implement the name and age fields 
    name: string; 
    age: number; 

    // Overload signature #1 
    sayHello(name: string): string; 
    // Overload signature #2 
    sayHello(age: number): number; 
    // Implementation signature, not visible to external callers 
    sayHello(arg: any): any { 
     if(typeof arg === 'string') { 
      return this.name; 
     } else if(typeof arg === 'number') { 
      return this.age; 
     } else { 
      throw new Error('sayHello can only take string or a number'); 
     } 
    } 
} 

var x = new Thing(); 
var n = x.sayHello('world'); // n: string 
var a = x.sayHello(42); // a: number 
var e = x.sayHello(false); // error: false is not string or number 
+0

+1。我会补充说,当向接口添加一个重载方法时,你省去了实现签名,你只需要这个类,如这个答案所示。 – Fenton

+0

这工作正常。谢谢,这是做这个实现的唯一方法吗?我觉得这个重写机制似乎只是用来限制输入参数/返回值的类型?如果不是,我可以声明函数签名为sayHello(arg:any):any在我的界面中,然后填充代码片段sayHello(arg:any):any {// if ... else ...}在我的实现中类。任何帮助清除我的困惑? –

+0

@Steve Fenton,对不起,我不明白你说的很好,只需要上课? –

相关问题