E0156: private properties are not allowed in object literals
Classes can declare private properties with #
. Object
cannot have private
properties. It is a syntax error to declare a private property in an object
literal:
class Account {
#email;
#password;
async save(db) {
await db.saveAccount({
#email,
#passwordHash: hashPassword(this.#password),
});
}
}
class DataSmuggler {
#contraband;
setContraband(object, contraband) {
return {
...object,
#contraband: contraband,
};
}
getContraband(object) {
return object.#contraband;
}
}
To fix this error, rename the properties to exclude the #
:
class Account {
#email;
#password;
async save(db) {
await db.saveAccount({
email: this.#email,
passwordHash: hashPassword(this.#password),
});
}
}
Alternatively, use a Symbol
to attach private data to an object:
const Contraband = Symbol('contraband');
class DataSmuggler {
setContraband(object, contraband) {
return {
...object,
[Contraband]: contraband,
};
}
getContraband(object) {
return object[Contraband];
}
}
Introduced in quick-lint-js version 0.3.0.