Angular 11 any/undefined 类型警告

Angular 11 any/undefined types warnings

我将我的应用程序从 Angular v10 升级到 v11,现在我收到了多个错误和警告,因为某些(可能是所有)字段可能一次未定义:

例如:

const savedToken = new Token(JSON.parse(localStorage.getItem(AuthInterceptor.tokenKey)));

必须变成:

const savedToken = new Token(JSON.parse(<string>localStorage.getItem(AuthInterceptor.tokenKey)));

警告:

Argument of type 'string | null' is not assignable to parameter of type 'string'. 
Type 'null' is not assignable to type 'string' 
// I know the localStorage value can be null in this case.

另一个例子:

public user$: Observable<User>;
// Property 'user$' has no initializer and is not definitely assigned in the constructor.

因为 user$ngOnInit() 中被初始化为 this.user$ = this.store.pipe()...

你是怎么解决的?

即使我从 angular.json 停用 strict,结果也是一样的:

"@schematics/angular:application": {
    "strict": false
}

我真的需要将我所有的应用程序代码逐行更新到 angular 11?谢谢

这是由 TypeScript 的严格 Class 初始化引起的。

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#strict-class-initialization

解决方案 1

利用 TypeScript 文档指示的 prop!: Type 语法向编译器表明我们知道该 prop 尚未初始化,我们稍后会处理它。

@Component({...})
export class ExampleComponent {
 @Input() inputExampleProp!: string; // ! indicates that we know the variable may be undefined
}

备用解决方案

如果您不关心严格的 class 初始化,您可以通过在编译器选项

中添加一个标志来在 tsconfig.json 中完全禁用该功能
{
 "compilerOptions": {
    "strictPropertyInitialization": false
  }
}

注意:您可能需要重新启动 IDE 才能刷新编译器选项。

在 ts.config 文件中,您只需将 strict:"true" 更改为 strict:"false"

“编译器选项”:{ "baseUrl": "./", "outDir": "./dist/out-tsc", “forceConsistentCasingInFileNames”:真, “严格”:假,

如果仍然显示错误,请重新启动 VISUAL STUDIO 代码 IDE!!!