typescript - Angular 6 : Användning av åtkomstmodifierare vid injicering av någon tjänst
Medan jag går igenom handledningen stöter jag på ett märkligt scenario.
när du injicerar tjänsten i din komponent om du missar åtkomstmodifieraren kommer det att ge dig ett fel som visas nedan, men att lägga till den som privat eller offentlig kommer att fungera bra.
Har vi inte någon standardräckvidd i Angular om vi saknar åtkomstmodifieraren?
export class UserDetailsComponent implements OnInit {
name="";
lastName="";
constructor(userService : UserServiceService) { }
ngOnInit() {
}
save(){
this.userService.saveUser();
}
}
Egenskapen 'userService' finns inte på typen 'UserDetailsComponent'.
Svar #1
Om du prefixar en konstruktörsparameter med en åtkomstmodifierare (private, protected eller public) eller readonly, blir den automatiskt "främjad" till en klass-egenskap i TypeScript. Denna konstruktion kallas för konstruktörsparameter-egenskaper.
Utan prefixet är konstruktörsparametern inget mer än en metodparameter, och du skulle behöva manuellt tilldela den till en deklarerad klassfastighet från konstruktören själv.
Från handboken:
TypeScript erbjuder en speciell syntax för att förvandla en konstruktörsparameter till en klassparameter med samma namn och värde. Dessa kallas parameteregenskaper och skapas genom att sätta ett av synlighetsmodifierarna
public,private,protectedellerreadonlyframför ett konstruktörsargument. Det resulterande fältet får dessa modifierare:
Svar #2
Alla svar som redan har lämnats är mycket tydliga och har bra information. Så för att göra saken enkel, här är vad som händer:
Din konstruktor är en funktion. I vilket programmeringsspråk som helst (som jag hittills har kommit i kontakt med) finns en funktions parametrar endast inom funktionens egen omfattning. Så parametern som skickas in i konstruktorn är inte tillgänglig i hela klassen om inte dess värde uttryckligen tilldelas en klassmedlem (som ses i den andra kodbiten som tillhandahållits av Samuel J Matthew).
Det som åtkomstmodifierarna i parametern gör är att de instruerar Angular att skapa ett klassmedlem med samma namn som parametern, med den angivna åtkomstmodifieraren, och initialisera det till en instans av parametertypen. Med andra ord blir parametern en klassmedlem/egenskap. Som redan har sagts kallas detta en parameter-egenskap, vilket är ett mycket passande namn för det.
Dokumentationen som Ken har tillhandahållit är mycket hjälpsam. Definitivt värd att läsa.