Angular Ivy strictTemplates true 类型 'boolean | null' 不可分配给类型 'boolean'

Angular Ivy strictTemplates true Type 'boolean | null' is not assignable to type 'boolean'

我已经将我的应用程序更新到 9 版本。 一切都很好,但我有问题 将 strictTemplates 设置为 true。 例如这段代码

loaded$: Observable<boolean>
[loaded]="loaded$ | async"
@Input() loaded!: boolean;

我收到错误类型 'boolean | null' 无法分配给类型 'boolean'。

这修复了错误

@Input() loaded!: boolean | null;

但是我看不懂要点,有人给我解释一下吗?

这更多的是 Typescript 更新错误而不是 Angular 更新,我相信,在 Typescript 2X 版本之后,nullundefined 不再是其他类型的子类型,这一如既往地提供更多的编译时间。静态类型检查。

如果您的实际类型是布尔值并且您收到的结果是 null,这不会对您产生太大影响,但如果您的实际类型是一个对象,您必须放心,Typescript 会强制您做所有真实的事情检查以免陷入运行时错误。

事实证明,Javscript 中的一切都是对象,但我们通常不使用布尔值作为对象,但如果我们使用:

let a = true;
console.log(a.toString());
a = null;
console.log(a.toString());

原因是因为 async 管道 return 签名总是类似于 <T>(input$: Observable<T>): T | null,因为它 return 在模板等待响应时对模板无效异步调用。

更多信息请点击此处:https://angular.io/guide/template-typecheck#strict-null-checks

您可以做您已经做过的事情并允许 null,或者如果您知道它永远不会为 null,请使用非 null 断言运算符:

[loaded]="(loaded$ | async)!"

或在此处禁用类型检查:

[loaded]="$any(loaded$ | async)"

或者对于这种特殊情况,您可能会这样做:

[loaded]="(loaded$ | async) || false"