2013-07-31 21 views
7

私はtypescriptを初めて使いました。ここには実装したいインターフェイスがあります。TypeScriptインターフェイスでオーバーライドメソッドを実装する方法は?

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

のsayHelloは、過負荷バージョンを示す2つのシグネチャを有しています。私はちょうどクラスで、どのような助けを実装する方法を知りませんか?ありがとう。

+0

有効なTypeScriptのようには見えません。ここでコードサンプルを見たことがありますか? http://www.typescriptlang.org/Tutorial/ –

+0

IntelSenseでエラーが発生していないので、私はこのコードスニペットをtypescriptの紹介ビデオから入手します: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)を埋めます:任意の{// if ... else ...}クラス。どんな助けが私の混乱を解消する? –

+0

@Steve Fenton、申し訳ありませんが、私はあなたが言うことを理解していない、唯一のクラスのために必要ですか? –

関連する問題