Read or write-only private fields should be accessed properly
- INVALID_PRIVATE_FIELD_ACCESS
- Error
- High
- es13
This rule applies when read or write-only private fields of a class are not accessed properly.
TypeError
exceptions are thrown in the following improper access cases:
- A value is assigned to a private field declared as a getter without a corresponding setter.
- A value is read from a private field declared as a setter without a corresponding getter.
- A private method is updated to another value. Unlike public methods, private methods are not writable. You should use a private field with a function expression instead in this case.
Noncompliant Code Example
View with compliant examples side by sideclass Example {
#firstName;
#lastName;
get #fullName() {
return `${this.#firstName} ${this.#lastName}`;
}
set #name(x) {
const nameParts = x.split(/\s+/);
this.#firstName = nameParts[0] || '';
this.#lastName = nameParts[1] || '';
}
#isValidName() {
return this.#firstName !== '' && this.#lastName !== '';
}
constructor(fullName) {
this.#fullName = fullName || ''; // INVALID_PRIVATE_FIELD_ACCESS alarm because only getter is defined for '#fullName'.
if (!this.#isValidName()) {
console.log(`${this.#name} is invalid!`); // INVALID_PRIVATE_FIELD_ACCESS alarm because only setter is defined for '#name'.
}
this.#isValidName = this.#isValidName.bind(this); // INVALID_PRIVATE_FIELD_ACCESS alarm because private method is read-only.
}
}
Compliant Code Example
View with noncompliant examples side by sideclass Example {
#firstName;
#lastName;
get #fullName() {
return `${this.#firstName} ${this.#lastName}`;
}
set #fullName(x) {
const nameParts = x.split(/\s+/);
this.#firstName = nameParts[0] || '';
this.#lastName = nameParts[1] || '';
}
#isValidName = () => this.#firstName !== '' && this.#lastName !== '';
constructor(fullName) {
this.#fullName = fullName || '';
if (!this.#isValidName()) {
console.log(`${this.#fullName} is invalid!`);
}
}
}
Version
This rule was introduced in DeepScan 1.49.0.
See
Uncaught TypeError: '#fullName' was defined without a setter
Uncaught TypeError: '#name' was defined without a getter
Uncaught TypeError: Private method '#isValidName' is not writable