johnpapa / angular-styleguide

Angular Style Guide: A starting point for Angular development teams to provide consistency through good practices.
http://johnpapa.net
MIT License
23.87k stars 4.15k forks source link

Private variable - leading underscore #861

Open froodley opened 6 years ago

froodley commented 6 years ago

Hi,

The style guide states:

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 commented 6 years ago

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 commented 6 years ago

Has there been any update here?

froodley commented 6 years ago

Still looking for feedback on this

alterfo commented 6 years ago

I agree

froodley commented 6 years ago

Ref:

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

pburkindine commented 6 years ago

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 commented 6 years ago

Ref:

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