TypeScript does not have private properties
You might think that TypeScript allows you to have private properties in your classes:
class Foobar {
private mySecret: string;
constructor() {
this.mySecret = "hello";
}
}
But remember, private properties aren't (yet) a feature of JavaScript. So this will transpile to the following code:
class Foobar {
constructor() {
this.mySecret = "hello";
}
}
Nothing private about that property. It's easily accessible in JavaScript.
It's not even that hard to get around in TypeScript:
const f = new Foobar();
console.log((f as any).mySecret);
// or, if you prefer
console.log((f as unknown as Record<string, unknown>).mySecret);
I can't say I often run into the need for a private field, so I'm not exactly sure what the best practice is these days. But I'd probably reach for a closure:
function createFoobar () {
const mySecret: string = "hello";
return {
getSecretLength() {
return mySecret.length;
}
}
}
It's a fairly old pattern, but it still works great.