angular - 我可以在 Angular 模板中进行类型缩小吗?

标签 angular typescript

我有一个将业务对象作为输入的组件。在此组件的模板中,我想通过检查仅存在于业务对象的某些子类上的属性值来有条件地呈现某些内容。

export class Thing { public foo: string; }
export class SubThing extends Thing { public bar: number; }

// ...
export class MyComponent {
  @Input() thing: Thing;
}

<!-- template file -->
{{ thing.foo }}
<div *ngIf="thing?.bar > 10">Conditional content...</div>

这曾经像写的那样工作,因为编译器对模板中的类型检查不是很严格。最近这开始与 AOT 编译器发生冲突(不确定具体是什么时候),因为严格来说,当编译器认为 thing 只是一个 时,thing?.bar 是无效的>Thing,并且不能确定它是 SubThing

我想说类似 *ngIf="thing instanceof SubThing && thing?.bar > 10" 但我不能在模板本身中使用 instanceof .有没有其他方法可以从模板中检查 thing 的类型,这样编译器就不会报错了? (我通过将我的输入指定为 any 使构建再次运行,但当然,如果可能的话,我想让我的类型检查回来。)

最佳答案

显然编译器尊重 User Defined Type Guards .我只需要在我的组件中定义一个方法:

export class MyComponent {
  // ...
  /** @internal */ isSubThing(t: Thing): t is SubThing {
    return t instanceof SubThing;
  }
}

<!-- template file -->
{{ thing.foo }}
<div *ngIf="isSubThing(thing) && thing?.bar > 10">
  Conditional content...
</div>

关于angular - 我可以在 Angular 模板中进行类型缩小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47220910/

相关文章:

angular - 如何在 Angular 6 中构建具有多个组件的表单?

javascript - 在字段中输入 3 个字符后如何执行 API 调用?

javascript - 如何实现一个没有名字的接口(interface)成员?

javascript - 可以预加载使用 canLoad 的模块吗?

Typescript 使用 keyof 时,索引签名参数类型必须为 'string' 或 'number'

javascript - 如何在 Angular 2、TypeScript 中获取视频的高度和宽度

arrays - *ngIf 检查数组中的值

angular - 如何在 Angular 货币管中隐藏货币符号

angular - 如何在 Angular4/Ionic 中使用 *ngFor 时从列表中获取单击的项目详细信息

typescript - TypeScript 模块上的 getter/setter