【问题标题】:Angular/TypeScript - Union type accessAngular/TypeScript - 联合类型访问
【发布时间】:2019-05-08 19:57:12
【问题描述】:

我有一个带有联合类型属性的接口:

interface Challenge {
  id: number;
  category: Category | string;
}

分类界面:

Interface Category {
  id: number;
  label: string;
}

在我的控制器中,我有一个 this.challenge 类型Challenge

现在我想从模板中显示challenge.category.label

<p>{{ challenge.category.label }}</p>

但它不起作用,因为字符串类型上不存在label 属性,如果我尝试从控制器访问该属性,则会出现相同的错误:

getLabel(): string {
  return this.challenge.category.label
}

如何指定这个类别实例的类型是Category,因为模板直接偏好

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    您可以使用Type Guards

    最简单的解决方案是:

    function getLabel(): string {
      return (<Category>this.challenge.category).label;
    }
    

    但如果你会多次使用它,那么值得创建一个类型保护:

    function getLabel(): string {
      if (isCategory(challenge.category)) {
        return this.challenge.category.label;
      } else {
        // this will be string
        return this.challenge.category;
      }
    }
    
    function isCategory(category: Category | string): category is Category {
      return (<Category>this.challenge.category).label !== undefined;
    }
    

    【讨论】:

    • 既然rank是通过an@input检索的,有没有办法强制分类类型到那个位置? @Input() rank: Rank;
    • @MouadEnnaciri 我不确定挑战和排名之间的关系是什么。你能更新问题吗?
    • 我错了对不起,是@Input() challenge: Challenge;
    猜你喜欢
    • 2023-04-03
    • 2020-02-25
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多