網站搜尋

typescript - Angular:為什麼沒有訪問修飾符的建構子參數在建構子之外不可見?


當我明確為建構子參數指定存取修飾符時,它在建構子外部也是可見的,例如:

constructor(private employeResourceService:EmployeeResourceService ){
//code}
 ngOnInit(){
    this.employeResourceService=undefined;//possible

  }

但是當我移除存取修飾符時,建構函數的參數在建構函數外部是看不到的,例如:

 constructor(employeResourceService:EmployeeResourceService ){
    //code}
     ngOnInit(){
        this.employeResourceService=undefined;//not visible

      }

為什麼會發生這種情況?TypeScript 沒有像 Java 那樣的預設存取修飾符嗎?

答案#1

給函數參數指定存取修飾符是毫無意義的。在 TypeScript 中,你無論如何可以對建構函數這樣做,其含義如下:當你寫

class MyClass {
  constructor(private employeResourceService: EmployeeResourceService){
    //code
  }
}

這實際上是一個捷徑,用於

class MyClass {
  private employeResourceService: EmployeeResourceService
  constructor(employeResourceService: EmployeeResourceService){
    this.employeResourceService = employeResourceService
    //code
  }
}

所以,在單一指令中,你已經定義了一個實例參數並且用參數值影響了它。這個捷徑只有在你提供存取說明詞時才有效。如果你沒有提供,它就會變成一個普通的函數參數,既沒有被宣告為實例參數,也沒有被影響到任何東西。

無論如何,存在一個預設的存取值,但要使用它,你必須宣告實例參數,並自行影響它:

class MyClass {
  employeResourceService: EmployeeResourceService
  constructor(employeResourceService: EmployeeResourceService){
    this.employeResourceService = employeResourceService
    //code
  }
}

答案#2

那是刻意為之,目的是讓程式碼更簡潔:在建構函數的輸入參數中加入存取修飾符,是在類別中宣告欄位、將參數傳入建構函數、然後再將其指派給類別欄位的一種簡短寫法。

而這其實有文件記載:https://www.typescriptlang.org/docs/handbook/classes.html#parameter-properties

編輯:Typescript 確實有一個默認的輸入參數模式:即當你只需要在構造函數中使用輸入參數,而之後不再需要時。例如一個很好的例子是 FormBuilder,你通常不會將它存儲在欄位中,因為你只需要使用它一次。