Angular 为什么赢了';缺少属性时aot编译器出错?

Angular 为什么赢了';缺少属性时aot编译器出错?,angular,angular-aot,Angular,Angular Aot,使用以下代码: 模板 <button (click)="myMethod()">myMethod()</button> <!-- <button (click)="foo()">foo()</button> --> <ng-container [ngSwitch]="state"> <ng-container *ngSwitchCase="0"> <div></div>

使用以下代码:

模板

<button (click)="myMethod()">myMethod()</button>
<!-- <button (click)="foo()">foo()</button> -->

<ng-container [ngSwitch]="state">
  <ng-container *ngSwitchCase="0">
    <div></div>
    <button (click)="myMethod()">myMethod()</button>
    <button (click)="foo()">foo()</button><!-- why no error -->
  </ng-container>
  <div *ngSwitchCase="1"></div>
</ng-container>
ng build--aot
builds,但是如果您取消注释模板中的第2行,您将得到预期的结果

类型“MyComponent”上不存在属性“foo”

为什么
ng容器中的
foo()
没有错误

在你建议之前:

<div *ngSwitchCase="0">
  <div></div>
  <button (click)="myMethod()">myMethod()</button>
  <button (click)="foo()">foo()</button><!-- why no error -->
</div>

myMethod()
foo()
那将变成

<div>
  <div></div>
  <button>myMethod()</button>
  <button>foo()</button>
</div>

myMethod()
foo()
但我只需要

<div></div>
<button>myMethod()</button>
<button>foo()</button>

myMethod()
foo()
还有其他方法可以解决这个问题,但问题是在做出错误或壮举之前要有基本的了解。

“还有其他方法可以解决这个问题吗…”

你试过这个吗

默认情况下,此AOT设置(当前)处于非活动状态

奖金: 另请参见编译器github上关于绑定表达式的本节:

验证使用TypeScript类型检查器和提供给TypeScript编译器的选项来控制类型验证的详细程度


在此阶段抛出错误“类型Y上不存在属性X”,验证详细信息的级别可以通过编译器参数进行调整,如前面提到的参数“fulltemplatetypecheck”。

这是我的评论:


AoT预先编译模板,并寻找要生成的绑定。另一方面,将它放在ng容器中是一件特殊的事情,因为ng容器在被调用之前不会被解释和编译

见本文:


我试着搜索更多的信息,我只是回到你关于角度问题的第一个评论:

从此线程到此问题的链接:

这似乎是一个持续的bug,所以这意味着ng容器应该被编译。
我想你现在对此无能为力

我认为这可能与AoT预先编译模板有关,并且正在寻找要生成的绑定。另一方面,将它放在ng容器中是一件特殊的事情,因为ng容器在被调用之前不会被解释和编译。请参阅本文:啊,那么ng容器在构建时没有编译吗?如果是这样,我将接受这个答案。请告诉我这是否解决了您遇到的问题。不确定如何在angular cli项目中设置
fullTemplateTypeCheck
。似乎暗示它在aot构建时已设置为true。如果在
tsconfig.json
中设置,但在
tsconfig.app.json
中似乎有效,则会抛出
未知编译器选项“angularCompilerOptions”。
,只是害怕在Automatic stuff cli上设置
angularCompilerOptions
,我认为您不应该害怕fulltemplatetypecheck参数。文件明确表示,在未来的默认情况下,它将是
true
。我猜,出于性能原因,开发团队在编译器早期将此参数设置为
false
。我的意思是,默认情况下
angularcomileroptions
甚至不是cli项目中
tsconfig.app.json
的一部分。为
fulltemplatetypecheck
设置一个属性可用于简单的复制repo,但我如何才能确信设置
angularCompilerOptions
不会覆盖任何其他编译器选项,也不会在以后的生产线或大型生产项目中以不可预见的方式更改angular cli的行为。(以前在美国做过类似的事情)
<div></div>
<button>myMethod()</button>
<button>foo()</button>