angular-styleguide icon indicating copy to clipboard operation
angular-styleguide copied to clipboard

Private variable - leading underscore

Open froodley opened this issue 6 years ago • 7 comments

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.

froodley avatar Jul 09 '18 16:07 froodley

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;
}

froodley avatar Jul 13 '18 15:07 froodley

Has there been any update here?

froodley avatar Aug 08 '18 19:08 froodley

Still looking for feedback on this

froodley avatar Aug 24 '18 20:08 froodley

I agree

alterfo avatar Sep 07 '18 15:09 alterfo

Ref:

https://github.com/angular/angular.io/issues/1108#issuecomment-342081891

froodley avatar Sep 16 '18 22:09 froodley

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.

pburkindine avatar Oct 11 '18 01:10 pburkindine

Ref:

https://github.com/angular/angular/issues/26393

pburkindine avatar Oct 11 '18 10:10 pburkindine