修改構造函數參數被認為是 breaking change:
Making any changes to the class constructor signature. Note that super calls need to be updated in classes extending ours.
如果我們在構造函數裡引入新的參數,這被認為是 breaking change:

注意以下三點:
(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
) {}
一個正确的例子: