修改 Angular Component 构造函数参数被认为是 breaking change-阿里云开发者社区

开发者社区> -开发者助手-> 正文

修改 Angular Component 构造函数参数被认为是 breaking change

简介: 修改 Angular Component 构造函数参数被认为是 breaking change
+关注继续查看

修改构造函数参数被认为是 breaking change:


Making any changes to the class constructor signature. Note that super calls need to be updated in classes extending ours.


如果我们在构造函数里引入新的参数,这被认为是 breaking change:

image.png对于升级到新次要版本以及之前通过使用较少参数调用 super() 构造函数在其代码库中扩展我们的服务的任何客户,这将导致 breaking change(特别是编译错误),例如在以下示例中 :image.png注意以下三点:


(1) 添加 ?使新的构造函数参数可选。否则,传递较少参数的客户将收到编译错误。

(2) 在类的逻辑中,允许新的构造函数参数为空或未定义。您可以通过使用可选链 (?.) 访问新依赖项的任何属性来实现此目的,例如 this.cartItemContextSource?.item$。如果不这样做,扩展我们的类并向 super() 构造函数传递较少参数的客户将在我们的逻辑中收到运行时错误,因为 this.cartItemContextSource 对象将是未定义的。

(3) 如果您的类可能未提供新的构造函数依赖项(例如,依赖项服务不是providedIn:‘root’,或者在DOM中有条件地提供),则在构造函数依赖项之前使用@Optional()。否则,当没有条件提供依赖时,客户将收到无法解析依赖的 Angular 运行时错误。在构造函数依赖项之前使用 @Optional() 告诉 Angular 在无法注入值时优雅地回退到 null。


除了上述要求,我们还鼓励您执行以下操作:


(1) 添加内联注释,例如 // TODO(#ticket-number): make X a required dependency,以引用下一个主要版本的计划工作。


(2) 在实现上方添加构造函数的两个替代声明。 最上面的声明必须是最新的。


这是因为,在使用 SSR 的生产构建中,只有第一个声明用于解决依赖关系。 将 @deprecated 自 X.Y 添加到您的 JSDoc 评论也很有帮助。 包含此内容后,客户的 IDE 可以警告他们正在使用的旧构造函数签名(参数较少)已被弃用,这可以促使他们尽早迁移到新签名。


Using the Inject Decorator for Dependencie

将 @Inject 用于依赖项时,不应包含任何构造函数声明。 相反,您应该只包含构造函数定义。


当您构建库时(例如,当您运行 ng build --prod core 时),ng-packagr 工具仅使用第一个构造函数声明来解析注入的依赖项,而忽略构造定义。 但是,构造函数声明中不支持 Inject 装饰器,因此它不能用于解析那里的依赖关系。 如果你包含一个带有依赖的构造函数声明,ng-packagr 工具将无法解析依赖,你会得到一个错误,如下所示:


ERROR: Internal error: unknown identifier []


一个错误的例子:

import { PLATFORM_ID } from '@angular/core';
/*...*/

  // Do not add any constructor declarations when using @Inject to resolve a dependency
  constructor(
    platformId: any, // this dependency will not be resolved, nor can it be fixed with @Inject, because the Inject decorator is not supported here!
    newService?: NewService
  ) {}
   constructor(
    protected platformId: any,
  ) {}

  constructor(
    @Inject(PLATFORM_ID) protected platformId: any,
    protected newService?: NewService
  ) {}

一个正确的例子:

image.png        

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
7.2 函数的参数
1、给 b 变量设定一个默认的值 如果实参传入的时候,指定了 b 的值,那 b 优先选择传入的实参,当 b 没有值时,才会用默认值 def funcA(a,b=0):     print(a)     print(b) funcA(1)        # b 变量选择默认实参...
479 0
c语言函数可变参数列表
原文:c语言函数可变参数列表 在函数原型中,列出了函数期望接受的参数,但原型只能显示固定数目的参数。让一个函数在不同的时候接受不同数目的参数是不是可以呢?答案是肯定的,但存在一些限制。   考虑一个计算一系列值的平均值的函数。
574 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10188 0
关于C++引用做为函数参数和指针作为函数参数
关于C++引用做为函数参数和指针作为函数参数 个人感觉引用和指针有着很多相识的地方 参考http://blog.itpub.net/7728585/viewspace-2113049/ 我们这里编写两段函数如下: 1、   AT_NAME &...
738 0
2450
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载