Javascript typescript索引签名访问器
我希望我的javascript数据如下所示:Javascript typescript索引签名访问器,javascript,typescript,accessor,index-signature,Javascript,Typescript,Accessor,Index Signature,我希望我的javascript数据如下所示: "dogs": { "ada": { age: 7, breed: poodle }, "levin": { age: 5, breed: shitzu }, ... } 其中名称是一个对象键。我有一个typescript类: export class Dog { [dogName: string]: DogDetails; } 我能看到的
"dogs": {
"ada": {
age: 7,
breed: poodle
},
"levin": {
age: 5,
breed: shitzu
},
...
}
其中名称是一个对象键。我有一个typescript类:
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)];
}
这太可怕了。一个原因是需要静态访问:
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();
}
因为它抱怨类型为“()=>string”的属性“getName”不能分配给字符串索引类型“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>
而getDogDetails()
是:
public getDogNames(): string[] {
if (this.dogs) {
return Object.keys(this.dogs);
} else {
return new Array<string>();
}
}
public getDogDetails(name: string): DogDetails {
return this.dogs[name];
}
这很有效,但不是我想要的。我将对@amiramw就解决我的总体问题提出的建议表示赞赏
不过,如果知道是否有办法获得typescript索引签名值,我将非常感激。您可以为每只狗的数据创建一个接口,并定义一个从字符串到该接口的映射。接口可以命名(用于重用)或匿名:
enum Breed {
poodle,
shitzu
}
let dogs : { [key:string]: {age: number, breed: Breed} } = {
"ada": {
age: 7,
breed: Breed.poodle
},
"levin": {
age: 5,
breed: Breed.shitzu
}
};
你怎么知道这个名字的?例如,“ada”你可以通过调用
Object.keys(dogs)
获得狗的列表,然后你就有了名字,你可以通过dogs[dogName]
访问每只狗的数据。另一个选项是在数组中维护狗列表,并将name
属性添加到界面中。好的,我知道你的方法了。我不认为您的typescript代码本质上与我的代码有任何不同,它只是您访问数据的方法。这可能是我必须要做的,但这与我认为应该做的相反,与教科书案例不同。我将更新我的问题,以符合用于遍历此数据的角度代码。谢谢你的努力。
enum Breed {
poodle,
shitzu
}
let dogs : { [key:string]: {age: number, breed: Breed} } = {
"ada": {
age: 7,
breed: Breed.poodle
},
"levin": {
age: 5,
breed: Breed.shitzu
}
};