2017-06-11 6 views
0

をアクセサ。私はaccesssorsを作成する方法をカプセル化することができることを見ることができましたtypescriptですインデックスの署名は、私がこのようなことに私のjavascriptのデータをご希望の

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

唯一の方法はDogにこれらの静的メソッドを追加することである:かなり恐ろしいです

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

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

私は、このtypescriptですクラスを持っています。

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

とされるであろう、これは書かれるべきかに非常に反しているようだ:

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

方法があった場合、状況は非常に良くなりビーイングは、静的なアクセスが必要とされることである一つの理由インデックスの署名値にアクセスします。しかし、私はこれを達成するための方法を見つけることができませんでした。方法がありますか、このクラスを書く良い方法がありますか?

:それは@amiramwとコメントの会話からの回答後Property 'getName' of type '() => string' is not assignable to string index type 'DogDetails'


アップデートを文句を言うので

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

:これはインデックスの署名を使用するクラスでは不可能であることを

注意これが使用されている角度成分は、

です。私が書く必要があります思わフィードバックした後
<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> 

getDogNames()がある
<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> 

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

そしてgetDogDetails()です:

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

私が探していたものではありません。私は@amiramwに、私の全体的な問題の解決策に関する提案を提供します。

しかし、私は、typescriptインデックスシグニチャ値を取得する方法があるかどうかを知っていて大変感謝していますか?

答えて

0

犬のデータごとにインターフェイスを作成し、文字列からそのインターフェイスへのマップを定義できます。インターフェイスは、(再利用のために)名前をつけることができます。

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

どのように名前を取得しますか?例えば。 "ada" – HankCa

+0

あなたは 'Object.keys(dogs)'を呼ぶことによって犬のリストを取得することができます。そして、あなたは名前を持ち、 'dogs [dogName]'を実行することによって各犬のデータにアクセスできます。他のオプションは、イヌリストを配列内に保持し、 'name'プロパティをインタフェースに追加することです。 – amiramw

+0

私はあなたのアプローチを参照してください。私はあなたのtypescriptコードが本質的に私が持っているものと異なっているとは思わない、それはデータにアクセスするあなたのアプローチです。これは私がそれをやらなければならないかもしれないが、テキストブックの場合とは違うやり方ではないと私は思う。このデータをトラバースするために使用されている角度コードで修飾するように質問を更新します。あなたの努力に感謝します。 – HankCa

関連する問題