Angular: Почему параметры конструктора без спецификатора доступа не видны вне конструктора? - PullRequest
1 голос
/ 27 мая 2020

Когда я явно указываю спецификатор доступа для параметра конструктора, он виден за пределами конструктора ex:

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

  }

но когда я удаляю спецификатор доступа, параметры конструктора не видны вне конструктора ex:

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

      }

Почему это происходит? TypeScript не имеет спецификатора доступа по умолчанию, например Java?

Ответы [ 2 ]

3 голосов
/ 27 мая 2020

Это сделано специально, чтобы сделать код менее подробным: добавление модификатора доступа к входному параметру в конструкторе - это краткий формат объявления поля в классе, передачи параметра в конструкторе и последующего присвоения его поле класса.

И это фактически задокументировано: https://www.typescriptlang.org/docs/handbook/classes.html#parameter -properties

EDIT: Typescript имеет режим входных параметров по умолчанию : это когда вам нужен только входной параметр в конструкторе, но не позже. Хорошим примером для этого является FormBuilder, который вы обычно не храните в поле, потому что он вам нужен только один раз.

1 голос
/ 27 мая 2020

Задавать спецификатор доступа параметру функции бессмысленно. В 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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...