2013-07-31 25 views
7

Jestem nowy w maszynopisie, oto interfejs, który chciałbym zaimplementować;jak zaimplementować metodę nadpisywania w interfejsie TypeScript?

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

sayHello ma dwa podpisy co wskazuje wersję przeciążeniem. po prostu nie wiem, jak to wdrożyć w klasie, jakiejkolwiek pomocy? dzięki.

+0

To nie wygląda na prawidłowy TypeScript. Czy obejrzałeś tutaj przykłady kodu? http://www.typescriptlang.org/Tutorial/ –

+0

Nie ma błędów za pośrednictwem IntelSense, otrzymuję ten fragment kodu z filmu wprowadzającego maszynopis tutaj: http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing -TypeScript –

+3

To jest całkowicie poprawny TypeScript i jest to poprawne, proste pytanie. Głosuj, aby ponownie otworzyć. –

Odpowiedz

8

Aby zaimplementować funkcję przeciążoną, napisz najpierw wszystkie sygnatury połączeń przeciążeniowych, które mają być widoczne, a następnie podpis implementacji stanowiący nadzbiór nad wszystkimi sygnaturami przeciążenia. Przykład:

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. Dodam, że pomijając sygnaturę implementacji dodając przeciążoną metodę do interfejsu, potrzebujesz tylko tego dla klas, jak pokazano w tej odpowiedzi. – Fenton

+0

to działa dobrze. dzięki, czy to jedyny sposób na wykonanie tej implementacji? wydaje mi się, że ten nadpisany mechanizm jest właśnie używany do ograniczenia typu input-args/return-values? jeśli nie, mógłbym zadeklarować podpis funkcji jako sayHello (arg: any): any in my interface, a następnie wypchać fragment kodu sayHello (arg: any): any {// if ... else ...} in my implementation klasa. jakaś pomoc oczyścić moje zamieszanie? –

+0

@Steve Fenton, przepraszam, nie rozumiem, co mówisz dobrze, potrzebujesz tylko tego na zajęcia? –