Vad är användningen av privata och skyddade konstruktörer i Typescript
Jag märkte att i Typescript kan du definiera en konstruktör med vilken åtkomstmodifierare som helst (privat, skyddad, offentlig). Vad kommer användningen av detta att vara? Kan någon ge ett giltigt exempel på hur man använder privata och skyddade konstruktörer i Typescript?
Exempel detta är en giltig kod i Typescript:
class A
{
private constructor()
{
console.log("hello");
}
}
Svar #1
Precis som i andra språk skulle användningen av detta vara att faktiskt inte tillåta någon (utom klassen själv) att instansiera klassen. Detta kan vara användbart till exempel med en klass som bara har statiska metoder (ett sällsynt användningsfall i Typescript eftersom det finns enklare sätt att göra detta), eller för att möjliggöra en enkel singleton-implementering:
class A
{
private constructor()
{
console.log("hello");
}
private static _a :A
static get(): A{
return A._a || (A._a = new A())
}
}
Eller speciella initieringskrav som kräver användning av en fabriksfunktion. Till exempel asynkron init:
class A
{
private constructor()
{
console.log("hello");
}
private init() :Promise<void>{}
static async create(): Promise<A>{
let a = new A()
await a.init();
return a;
}
}
Svar #2
Detta skulle kunna användas för singletonmönstret.
En av metoderna för detta är att inte låta extern kod skapa instanser av klassen överhuvudtaget. Istället använder vi en statisk accessor:
class SingletonExample {
private constructor() {
console.log('Instance created');
}
private static _instance: SingletonExample | undefined;
public prop = 'value';
public static instance() {
if (this._instance === undefined) {
// no error, since the code is inside the class
this._instance = new SingletonExample();
}
return this._instance;
}
}
const singleton = SingletonExample.instance(); // no error, instance is created
console.log(singleton.prop); // value
const oops = new SingletonExample(); // oops, constructor is private
