2013-07-31 3 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): любой в моем интерфейсе, а затем наполнить фрагмент кода sayHello (arg: any): any {// if ... else ...} в моей реализации класс. любая помощь очищает мое замешательство? –

+0

@Steve Fenton, извините, я не понимаю, что вы говорите хорошо, нужно только для занятий? –