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

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

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

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

   export class CustomService extends SpartacusService {constructor(promotionService: PromotionService){super(promotionService); // <--------- wrong constructor signature/* customer's constructor logic here */}}

正确做法:

// TODO(#10946): make CartItemContextSource a required dependencyconstructor(promotionService: PromotionService,// eslint-disable-next-line @typescript-eslint/unified-signaturescartItemContextSource: CartItemContextSource);/*** @deprecated since 3.1*/constructor(promotionService: PromotionService);constructor(protected promotionService: PromotionService,@Optional() protected cartItemContextSource?: CartItemContextSource) {}/* ... */method() {console.log(this.cartItemContextSource?.item$);}

注意以下三点:

(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 dependencyconstructor(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) {}

一个正确的例子:

import { PLATFORM_ID } from '@angular/core';
/*...*/constructor(@Inject(PLATFORM_ID) protected platformId: any,protected newService?: NewService) {}

修改 Angular Component 构造函数参数被认为是 breaking change相关推荐

  1. SAP Spartacus单元测试用例中Component构造函数的调用上下文

    我有一个Angular Component,构造函数的两个参数通过依赖注入指定. 在单元测试时候,观察这两个参数如何被注入的.在构造函数被调用之前,先执行实例的初始化逻辑: 观察此时的this: 最后 ...

  2. angular路由传递参数_Angular路由——在路由时候传递数据

    有3种方式 1.在查询参数中传递数据 2.在路由路径中传递数据 定义路由路径时就要指定参数名字,在实际路径中携带参数. 3.在路由配置中传递数据 一.在查询参数中传递数据 第一步:修改模版中商品详情链 ...

  3. 深入解析Angular Component的源码示例

    本篇文章主要介绍了剖析Angular Component的源码示例,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. Web Component 定 ...

  4. 重构ElementUI解决DatePicker日期选择组件修改父组件placement参数问题[Vue.js项目实践: 新冠自检系统]

    新冠疫情自我检测系统网页设计开发文档 Sylvan Ding 的第一个基于 Vue.js 的项目. 本项目所提供的信息,只供参考之用,不保证信息的准确性.有效性.及时性和完整性,更多内容请查看国家卫健 ...

  5. 面向对象——访问器、修改器、构造函数、对象的创建流程

    在之前的代码讲解中,我们将一类事物封装成一个类,再去创建一个相应的对象去调用方法完成相应的操作这是非常方便的,但是在之前的代码我们发现,对象不仅仅能调用类中的方法,还可以访问到该类中的成员变量并进行赋 ...

  6. python函数type的用意_Python中type的构造函数参数含义说明

    测试代码如下: 复制代码 代码如下: class ModelMetaClass(type): def __new__(cls,name,base,attrs): logging.info(" ...

  7. 改mysql修改界定符_dbvisualizer参数设置

    6.13 可否完全禁用数据编辑? 可以. 方法: 在文本编辑器里打开文件 DBVIS-HOME/resources/dbvis-custom.prefs. 找出 dbvis.disabledataed ...

  8. Struts文件上传包含修改文件上传参数,多文件上传

    配置xml: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC& ...

  9. 使用 C++0x 时 make_shared 完美转发构造函数参数的测试编译器

    使用 C++0x 时 make_shared 完美转发构造函数参数的测试编译器 实现功能 C++实现代码 实现功能 使用 C++0x 时 make_shared 完美转发构造函数参数的测试编译器 C+ ...

最新文章

  1. WebService之soap类型的服务和rest类型的服务
  2. 大厂架构都开始做机房多活了
  3. Vue:Vue的< span >文字怎么加粗?
  4. google nexus5x 刷机抓包逆向环境配置(一)
  5. 中国厂商加速5G前瞻性部署
  6. hadoop学习笔记(三):hdfs体系结构和读写流程(转)
  7. Linux Shell 简介
  8. 我们学的技术会过时吗?甚至被淘汰?
  9. 完整的WebApplication JSF EJB JPA JAAS –第2部分
  10. Ulysses for Mac(最好用的纯文本编辑器)v22(65099)直装版
  11. Xbox One:未来的客厅主角
  12. 【git】 vim的使用
  13. ReflectionUtils.invokeMethod的作用
  14. 安卓手机管理软件_超强手机磁力搜索+播放+下载软件,满速下载,一键播放!...
  15. HDLBits学习------Problem 106~114
  16. spring MVC 导出excel
  17. kali工具之Beef
  18. 抽奖活动前端源码-可录入抽奖人名单
  19. 海滩xxxx_人工智能处理海洋垃圾:借助数据清理世界各地的海滩
  20. Dreamweaver之简单实现网站布局、图片漂浮、区域跳转、登陆注册及图片查看器

热门文章

  1. iOS 11.4.1 正式版越狱
  2. 多线程基础知识了解一下
  3. 基于bboss开发平台eclipse开发工程生成工具介绍
  4. linux下查找某个目录下包含某个字符串的文件
  5. 基于Ameoba实现mysql读写分离
  6. 7_15_2013 E: 机器人II
  7. windows和linux的协议栈驱动
  8. 如何使用Sublime Text 3作为Markdown编辑器
  9. shell的变量以及常见符号
  10. SQL语句中LEFT JOIN、JOIN、INNER JOIN、RIGHT JOIN的区别?