2017-06-11 50 views
0

我想我的JavaScript的数据是这样的:打字稿指数签名访问器

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

凡的名字是一个对象的关键。我有这个打字稿类:

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

我看得出来,我可以封装方法来创建accesssors的唯一方法是通过将这些静态方法来Dog

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

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

,这是相当可怕的。其中一个原因是是静态访问是必需的:

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

,似乎这样违背了这个应该怎么写,这将是:

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

,情况会好得多,如果有办法访问索引签名值。但是我找不到任何方法来实现这一点。有没有办法或者有更好的方法来写这个课程?

请注意,这是不可能的使用指数签名的类:

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

既然抱怨答案后Property 'getName' of type '() => string' is not assignable to string index type 'DogDetails'


更新从@amiramw和意见的对话:

使用的角度分量是:

<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> 

看来我需要写的反馈后:

<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> 

其中getDogNames()是:

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]; 
    } 

哪些工作,但这不是我正在寻找的。对于我的整体问题的解决方案,我会给予我们最好的答案。

但是,我很高兴知道是否有办法获得打字稿索引签名值?

回答

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(狗)来得到狗的列表,然后你就可以得到这些狗的名字,你可以通过'dog [dogName]'来访问每个狗的数据。其他选项是维护数组中的狗列表并向接口添加'name'属性。 – amiramw

+0

好的,我看到你的方法。我不认为你的打字稿代码与我所拥有的基本上不同,它只是你访问数据的方法。这可能是我必须做的事情,但是这与我认为应该完成的事情不同,并且与文本案例不同。我将更新我的问题,以便使用用于遍历此数据的角码进行限定。感谢您的努力。 – HankCa