2013-04-27 8 views
8

Jak zaimplementować interfejs, który jest indexible:Wdrożenie indexible interfejs

interface fooInterface{ 
    // indexable 
    [index:string]:number; 
    [index:number]:number;   
} 


class Foo implements fooInterface{ 
    // What goes here? 
} 
+1

http://blogs.msdn.com/b/typescript/archive/2013/01/24/interfaces-walkthrough.aspx - Half Way w dół znajdziesz "Opisywanie obiektu indeksowanego". Moje czytanie jest takie, że nigdy nie zaimplementujesz go w definicji klasy, ale tylko przez adresowanie 'instancji [index]' - więc twój 'fooInterface' nie może być użyty przez' narzędzia 'ale tylko strukturalnie, np .: 'var foo : fooInterface = {}; 'Nie jest to jednak pewne - stąd raczej komentarz niż odpowiedź. – JcFx

+0

To jest właściwie poprawne. Byłbym szczęśliwy, gdy oznaczyłbym to jako odpowiedź. Nie znajduje się w specyfikacji klasy. – basarat

+1

Są też inne rzeczy w interfejsach maszynopisowych, których nie można zaimplementować w klasie, np. zadzwoń do podpisów – basarat

Odpowiedz

9

Nie zawsze wdrożyć go w definicji klasy, ale tylko poprzez zajęcie instance[index], więc fooInterface nie można być używany przez implements w klasie TypeScript, ale można go użyć do opisania oczekiwanej struktury obiektu, np. var foo: fooInterface = {};

Opisując przestawną Przedmiot

wspólny wzorzec JavaScript jest użycie obiektu (na przykład {}) w drodze mapie z zestawem łańcuchów do ustalonej wartości. Gdy wartości te są równe tego samego typu, można użyć interfejsu do opisania tego indeksowania do obiektu , który zawsze generuje wartości określonego typu (w tym przypadku widżet ).

interface WidgetMap { 
    [name: string]: Widget; 
} 

var map: WidgetMap = {}; 
map['gear'] = new GearWidget(); 
var w = map['gear']; // w is inferred to type Widget 

Cytat i przykładem Widget pochodzi z: http://blogs.msdn.com/b/typescript/archive/2013/01/24/interfaces-walkthrough.aspx