Angular 5 + Swagger Codegen和严格的Null检查

时间:2018-07-30 18:09:28

标签: typescript angular-cli swagger-codegen

在我的angular-cli(最新)项目(ng v5 LTS)的tsconfig.json中,我已经设置(必须保留)

"strictNullChecks": true,

我使用Swagger Codegen(Maven v2.3.1)生成api客户端模型。该命令正在使用这些选项:

`-jar ${jarPath} generate -i ${apiPath} -l typescript-angular -o ${outputPath} --type-mappings Date=string -D withInterfaces=true --additional-properties ngVersion=5`

在.angular-cli.json中,我将生成的文件排除在掉毛之外,例如:

  ...,
  "lint": [
    {
      ...
      "exclude": ["**/swagger/**"]
    }, ...

当我进行“ ng服务”或“ ng构建”时,会得到多个

error TS2532: Object is possibly 'undefined'

用于生成的配置对象。像这样一个:

...
import { Configuration } from '../configuration';
...
if (this.configuration.apiKeys["Authorization"]) {
    headers = headers.set('Authorization',
    this.configuration.apiKeys["Authorization"]);
}
...

我也尝试在tslint.json和tsconfig扩展中排除生成的swagger文件,但是没有运气。

是否可以设置Swagger Codegen以生成通过严格的空检查的文件,或者设置Angular CLI以在aot编译过程中省略掉swagger文件的毛发?

注意:我必须使用AOT编译。


我唯一想到的解决方案是以编程方式替换

的所有实例
if (this.configuration.apiKeys["Authorization"])

with

if (this.configuration.apiKeys && this.configuration.apiKeys["Authorization"])

或objectHasOwnProperty或类似的评估结果...但这听起来像是强力策略...

1 个答案:

答案 0 :(得分:0)

如果实际上总是定义apiKeys 的一种惯用的TypeScript解决方案是使用non-null assertion operator

  

新的!后缀表达式运算符可用于断言其   在以下类型的上下文中,操作数是非{null和非undefined   检查器无法得出结论。具体来说,操作   x!产生类型为x的值,其中排除了nullundefined

所以在您的情况下:

if (this.configuration.!apiKeys["Authorization"]) { ... }

也就是说,使用.hasOwnProperty()检查也不是坏模式:它是惯用的JavaScript。

(恐怕我对Swagger Codegen不熟悉,也许其他人可以为您的上游工作流提供有用的答案。)