打字稿索引签名访问器

汉卡

我希望我的 javascript 数据是这样的:

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

其中名称是对象键。我有这个打字稿类:

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();
}

既然抱怨 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];
  }

哪个有效,但不是我想要的。对于解决我的整体问题的建议,我将给予 @amiramw 信用。

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

阿米拉姆

您可以为每只狗的数据创建一个接口,并定义从字符串到该接口的映射。接口可以命名(用于重用)或匿名:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

打字稿:类型中缺少索引签名

来自分类Dev

打字稿:扩展接口时类型中缺少索引签名

来自分类Dev

定义没有索引签名的打字稿对象形状

来自分类Dev

定义没有索引签名的打字稿对象形状

来自分类Dev

在打字稿中继承访问器

来自分类Dev

打字稿无法从打字稿装饰器访问属性类型。(目标是:{})

来自分类Dev

从类装饰器中访问注入的服务?打字稿/ NestJS

来自分类Dev

侦听器中的打字稿访问全局变量

来自分类Dev

打字稿-参数类型为“字符串”的无索引签名

来自分类Dev

我如何在打字稿中的嵌套for ... in循环中正确键入索引签名?

来自分类Dev

无法识别接口上“字符串”类型的索引签名(打字稿)

来自分类Dev

打字稿:如何在接口的字符串索引签名定义中引用属性名

来自分类Dev

对象文字中的动态键访问导致打字稿签名扩大

来自分类Dev

导出打字稿功能“缺少通话签名”

来自分类Dev

打字稿-在保留签名的同时包装功能

来自分类Dev

导出打字稿功能“缺少通话签名”

来自分类Dev

打字稿中的原型:元素隐式具有“任何”类型,因为类型“_BaseOption”没有索引签名

来自分类Dev

打字稿装饰器混乱

来自分类Dev

打字稿装饰器参数

来自分类Dev

打字稿:访问类的静态成员,而无需从构造函数签名数组中实例化它

来自分类Dev

打字稿:命名属性类型必须可分配给字符串索引器类型

来自分类Dev

打字稿:使用元组作为索引类型

来自分类Dev

索引对象的打字稿参考值

来自分类Dev

什么是打字稿中的可索引类型?

来自分类Dev

在打字稿中访问类属性

来自分类Dev

打字稿错误访问globalThis属性

来自分类Dev

打字稿:无法访问类属性

来自分类Dev

在打字稿中为Object.assign签名?

来自分类Dev

打字稿,从接口中提取多个呼叫签名

Related 相关文章

  1. 1

    打字稿:类型中缺少索引签名

  2. 2

    打字稿:扩展接口时类型中缺少索引签名

  3. 3

    定义没有索引签名的打字稿对象形状

  4. 4

    定义没有索引签名的打字稿对象形状

  5. 5

    在打字稿中继承访问器

  6. 6

    打字稿无法从打字稿装饰器访问属性类型。(目标是:{})

  7. 7

    从类装饰器中访问注入的服务?打字稿/ NestJS

  8. 8

    侦听器中的打字稿访问全局变量

  9. 9

    打字稿-参数类型为“字符串”的无索引签名

  10. 10

    我如何在打字稿中的嵌套for ... in循环中正确键入索引签名?

  11. 11

    无法识别接口上“字符串”类型的索引签名(打字稿)

  12. 12

    打字稿:如何在接口的字符串索引签名定义中引用属性名

  13. 13

    对象文字中的动态键访问导致打字稿签名扩大

  14. 14

    导出打字稿功能“缺少通话签名”

  15. 15

    打字稿-在保留签名的同时包装功能

  16. 16

    导出打字稿功能“缺少通话签名”

  17. 17

    打字稿中的原型:元素隐式具有“任何”类型,因为类型“_BaseOption”没有索引签名

  18. 18

    打字稿装饰器混乱

  19. 19

    打字稿装饰器参数

  20. 20

    打字稿:访问类的静态成员,而无需从构造函数签名数组中实例化它

  21. 21

    打字稿:命名属性类型必须可分配给字符串索引器类型

  22. 22

    打字稿:使用元组作为索引类型

  23. 23

    索引对象的打字稿参考值

  24. 24

    什么是打字稿中的可索引类型?

  25. 25

    在打字稿中访问类属性

  26. 26

    打字稿错误访问globalThis属性

  27. 27

    打字稿:无法访问类属性

  28. 28

    在打字稿中为Object.assign签名?

  29. 29

    打字稿,从接口中提取多个呼叫签名

热门标签

归档