angular-styleguide
angular-styleguide copied to clipboard
Private variable - leading underscore
Hi,
The style guide states:
- Avoid prefixing private properties and methods with an underscore. https://angular.io/guide/styleguide#style-03-04
However, this is in direct conflict with how getters and setters work in TypeScript. Because the getter/setter is not a normal function, but instead has the public name of the property, I cannot have a private property propertyX
because propertyX will be the name of the getter and setter.
The
public get propertyX(): SomeType { return this._propertyX; }
pattern is the one in the TypeScript docs:
https://www.typescriptlang.org/docs/handbook/classes.html
... and the one used by the tooling by default.
_ is prepended, for instance, if you convert a class with public fields by adding getters and setters in WebStorm. Also, the tslint-consistent-codestyle package's naming-convention default is to enforce _.
https://www.npmjs.com/package/tslint-consistent-codestyle
If another naming convention is preferred over the leading underscore, the style guide should let us know what it is.
The main VS Code plugin (?) for autogenerating getters and setters https://marketplace.visualstudio.com/items?itemName=DSKWRK.vscode-generate-getter-setter&sm_au=iVV7W3sWs2200Q56
has this behavior:
If a private variable is named with a leading underscore, the getter and setter will be generated in the same way as described in the TS documentation, above.
If it does not have a leading underscore, the getter and setter will be generated with a leading $, and the internal variable will remain unchanged. This does not seem preferable to the internal leading underscore:
public get $var1(): string {
return this.var1;
}
Has there been any update here?
Still looking for feedback on this
I agree
Ref:
https://github.com/angular/angular.io/issues/1108#issuecomment-342081891
An important concern for us here is that the recommended behavior be lintable.
tslint-consistent-codestyle.naming-convention e.g. allows us to define a pattern for all private fields, but not a rule that would only apply to internal fields mapped by public properties.
So e.g. 'Consider using _ only for internal fields mapped by properties' would not be lintable.
Ref:
https://github.com/angular/angular/issues/26393