我可以在Angular模板中缩小类型吗?

编码器

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

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?.bar当编译器认为thing只是a,它是无效Thing,并且不能肯定地说它是a SubThing

我想说些类似的内容,*ngIf="thing instanceof SubThing && thing?.bar > 10"但不能instanceof在模板本身中使用。还有其他方法可以检查thing模板的类型,以便编译器停止抱怨吗?(我通过指定Input为使构建再次正常工作,any但是如果可能的话,我当然想让我的类型检查回来。)

编码器

显然,编译器遵守用户定义类型防护我只需要在我的组件中定义一个方法:

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>

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 Angular 4 中,我可以以编程方式更改模板中使用的组件类型吗?

我可以在angular2模板中对管道(|)使用'=='吗?

我可以访问嵌套模板的类型吗?

我可以为模板类的模板类型添加参数吗

我可以在TypeScript中缩小范围吗?

我可以从类型列表中声明模板专业化吗?

在C ++中可以推断类型转换为模板类型吗?

我可以为不同的类型集定义模板吗?

我可以在模板排序中使用简单类型吗?

mapStateToProps可以缩小道具的类型吗?

我可以列出haskell中的类型吗?

我可以将带有属性的对象文字传递给 Angular 模板中的子级吗?

我可以在angular 2+模板中执行数组方法吗

我可以缩小在 TypeScript 中使用 require 导入的模块类型吗?

我可以缩小而不用webpack丑化吗

我可以缩小glb文件吗?

可以推断模板函数中的参数类型吗?

我可以提取映射类型中的可观察类型吗?

我可以将引用类型传递给模板以指定以下非类型模板参数的类型吗?

在jekyll中可以缩小JS吗?

我可以将整个HTML文档放在模板中吗?

我可以在Typeahead.js中更改模板引擎吗?

我可以在jekyll中定义微小的模板或函数吗?

我可以在C ++中按模板调用类的成员吗?

我可以在Joomla中制作存档页面模板吗?1.5?

我可以在模板参数中声明constexpr lambda吗?

我可以在azure函数绑定模板中合并值吗?

我可以不使用$ ctrl吗?在角度分量模板中

我可以在Flask模板中嵌套变量吗?