2017-06-11 7 views
0

Ich würde meine Javascript Daten mag so sein:Typoskript Index Unterschrift Accessoren

"dogs": { 
    "ada": { 
     age: 7, 
     breed: poodle 
    }, 
    "levin": { 
     age: 5, 
     breed: shitzu 
    }, 
    ... 
} 

Wo der Name einen Objektschlüssel ist. Ich habe diese Typoskript Klasse:

export class Dog { 
    [dogName: string]: DogDetails; 
} 

Der einzige Weg, konnte ich sehen, dass ich Methoden kapseln könnte accesssors zu erstellen, ist durch diese statischen Methoden Dog Zugabe:

public static getDogName(dog: Dog): string { 
    return Object.keys(dog).toString(); 
    } 

    public static getDogDetails(dog: Dog): DogDetails { 
    return dog[Dog.getDogName(dog)]; 
    } 

das ist ziemlich schrecklich. Ein Grund dafür ist, dass statischer Zugriff erforderlich ist:

Dog.getDogName(dog) // this is how it must be done 

Und scheint so entgegen, wie diese geschrieben werden sollen, das wäre:

dog.getName(); // this unfortunately can't be done 

Die Situation viel schöner wäre, wenn es eine Möglichkeit gäbe, Zugriff auf den Indexsignaturwert erhalten. Ich konnte jedoch keinen Weg finden, dies zu erreichen. Gibt es eine Möglichkeit oder gibt es eine bessere Möglichkeit, diese Klasse zu schreiben?

Beachten Sie, dass diese mit den Klassen nicht möglich Index Signaturen:

public getName(): string { // this won't work 
    Object.keys(this).toString(); 
} 

Da es Property 'getName' of type '() => string' is not assignable to string index type 'DogDetails'


Update nach Antwort von @amiramw und Kommentare Gespräch klagt:

Die Winkelkomponente, bei der dies verwendet wird, ist:

<ion-list *ngFor="let dog of dogs"> 
    <ion-item> 
     <ion-avatar item-start> 
     <img src="assets/img/dog.jpg"/> 
     </ion-avatar> 
     <h4>{{Dog.getName(dog)}}</h4> 
     <p>{{Dog.getDogDetails(dog).breed}}</p> 
    </ion-item> 
    </ion-list> 

Nach dem Feedback es scheint, ich werde schreiben müssen:

<ion-list *ngFor="let dogName of getDogNames()"> 
    <ion-item> 
     <ion-avatar item-start> 
     <img src="assets/img/dog.jpg"/> 
     </ion-avatar> 
     <h4>{{dogName}}</h4> 
     <p>{{getDogDetails(dogName).breed}}</p> 
    </ion-item> 
    </ion-list> 

Wo getDogNames() ist:

public getDogNames(): string[] { 
    if (this.dogs) { 
     return Object.keys(this.dogs); 
    } else { 
     return new Array<string>(); 
    } 
    } 

Und getDogDetails() ist:

public getDogDetails(name: string): DogDetails { 
    return this.dogs[name]; 
    } 

Welche funktioniert, aber ist nicht das, was ich gesucht habe. Ich werde @amiramw den Vorschlag für eine Lösung meines Gesamtproblems gutschreiben.

Allerdings würde ich sehr schätzen wissen, ob es eine Möglichkeit gibt, den Typoskript Index Signaturwert zu erhalten ??

Antwort

0

Sie können eine Schnittstelle für die Daten jedes Hundes erstellen und eine Zuordnung von der Zeichenfolge zu dieser Schnittstelle definieren. Die Schnittstelle kann (zur Wiederverwendung) oder anonym benannt werden:

enum Breed { 
    poodle, 
    shitzu 
} 
let dogs : { [key:string]: {age: number, breed: Breed} } = { 
    "ada": { 
     age: 7, 
     breed: Breed.poodle 
    }, 
    "levin": { 
     age: 5, 
     breed: Breed.shitzu 
    } 
}; 
+0

Wie erhalten Sie den Namen? z.B. "ada" – HankCa

+0

Du kannst die Liste der Hunde bekommen, indem du 'Object.keys (dogs)' nennst und dann hast du die Namen und du kannst auf alle Hundedaten zugreifen, indem du 'dogs [dogName]' machst. Eine andere Möglichkeit besteht darin, die Hundeliste in einem Array zu pflegen und der Schnittstelle die Eigenschaft 'name' hinzuzufügen. – amiramw

+0

Ok ich sehe deinen Ansatz.Ich glaube nicht, dass Ihr Typoskript-Code im Wesentlichen anders ist als das, was ich habe, es ist nur Ihre Vorgehensweise, um auf die Daten zuzugreifen. Dies mag sein, wie ich es tun muss, aber es steht im Gegensatz zu meiner Meinung, dass es anders sein sollte und anders als in Lehrbüchern. Ich werde meine Frage aktualisieren, um mich mit dem Winkelcode zu qualifizieren, der zum Durchqueren dieser Daten verwendet wird. Danke für Ihr Bemühen. – HankCa

Verwandte Themen