Проходя обучение, я сталкиваюсь со странным сценарием.
при внедрении службы в свой компонент, если вы пропустите модификатор доступа, он выдаст вам ошибку, как указано ниже, но добавление его как частного или общедоступного будет работать нормально.
Разве у нас нет области действия по умолчанию в Angular, если мы пропустим модификатор доступа?
export class UserDetailsComponent implements OnInit {
name = "";
lastName = "";
constructor(userService : UserServiceService) { }
ngOnInit() {
}
save(){
this.userService.saveUser();
}
}
Property 'userService' does not exist on type 'UserDetailsComponent'.





Typescript предоставляет вам ярлык для общего шаблона для внедрения зависимостей.
Вы можете поместить это в свой конструктор:
this.userService = userService
А также создайте объявление свойства:
userService: UserService;
Или вы можете просто указать «public» в параметре функции ctor, и Typescript сделает все это за вас. То же самое и с «частным». Но AOT может потерпеть неудачу, если попытаться использовать частное свойство в вашем шаблоне.
Если вы префикс параметра конструктора с помощью модификатора доступа (private, protected или public) или readonly, он автоматически становится «повышенным» как свойство класса в TypeScript. Эта конструкция называется свойства параметра конструктора.
Без префикса параметр конструктора является не чем иным, как параметром метода, и вам придется вручную назначить его объявленному свойству класса из самого конструктора.
Из справочник:
Parameter properties are declared by prefixing a constructor parameter with an accessibility modifier or
readonly, or both. Usingprivatefor a parameter property declares and initializes a private member; likewise, the same is done forpublic,protected, andreadonly.
Проблема возникает, когда вы не предоставляете спецификатор доступа для параметров конструктора, он не будет зарегистрирован на уровне класса. Вместо этого область действия переменной параметра ограничена функцией конструктора. Чтобы сделать ее доступной для всего класса, мы даем модификаторы доступа
С твоим примером
export class UserDetailsComponent implements OnInit {
name = "";
lastName = "";
constructor(userService : UserServiceService) {
console.info(userService)
}
ngOnInit() {
}
save(){
this.userService.saveUser();
}
}
userService доступен только внутри конструктора
Если вы поместите console.info(userService) внутрь конструктора, вы можете получить некоторый вывод консоли.
Если вы не хотите указывать какие-либо модификаторы доступа или хотите назначить другую переменную класса, вы можете указать, как показано ниже
export class UserDetailsComponent implements OnInit {
name = "";
lastName = "";
private _service
constructor(userService : UserServiceService) {
this._service = userService;
}
ngOnInit() {
}
save(){
this._service.saveUser();
}
}
В приведенном выше коде я назначил введенный userService другому члену класса _service.
Вообще нет причин переименовывать. Вы можете просто сделать this.userService = userService, чтобы назначить параметр конструктора свойству с тем же именем.
Все уже предоставленные ответы очень ясны и содержат полезную информацию. Проще говоря, вот что происходит:
Ваш конструктор - это функция. На любом языке программирования (с которым я сталкивался до сих пор) параметры функции существуют только в рамках самой функции. Таким образом, параметр, передаваемый в конструктор, недоступен во всем классе, если его значение явно не присвоено члену класса (как показано во втором фрагменте кода, предоставленном Самуэлем Дж. Мэтью.
Модификаторы доступа в параметре инструктируют Angular создать член класса с тем же именем, что и параметр, с предоставленным модификатором доступа и инициализировать его экземпляром типа параметра. Другими словами, параметр становится членом / свойством класса. Как уже было сказано, это называется свойством параметра, и это очень подходящее название для него.
Документация, предоставленная Кеном, очень полезна. Определенно стоит прочитать.