2016-08-04 34 views
1

Ich komme aus C# Hintergrund. Die meisten meiner Klassen sind so konzipiert, dass sie unveränderbar sind. Ich habe mich gefragt, ob es eine gute Übung ist, private Konstruktorvariablen und öffentliche Getter für den Zugriff auf Daten in TypeScript-Klassen zu verwenden.Private Konstruktorvariablen und öffentliche Getter für TypeScript-Klassen

Zum Beispiel:

class UnitType { 
    constructor(private code: string, private name: string, private unitType: string) { 

} 

get Code(): string { 
    return this.code; 
} 
get Name(): string { 
    return this.name; 
} 
get UnitType(): string 
    return this.unitType; 
} 

Ich kann nicht wie oben keine Beispiele von Typoskript Code zu finden scheinen. Fehle ich etwas?

+0

Es ist in Ordnung, aber nicht nutzen Ihre Getter oder sie werden zu erfahrenen Entwicklern wie Klassennamen suchen. 'private _code' und' get code() 'wären typischer. – JohnnyHK

+0

Es war C# dev's Gewohnheit ... –

+0

@JohnnyHK Verstanden. Wie Harry sagte, ist es eine C# Best Practice, um Immobilien zu kapitalisieren. Aber wenn in Rom ... – cruzan

Antwort

1

Ja, es ist eine gute Übung. Kapselung ist immer eine gute Sache: Sie verringert die "Fehleroberfläche" und verringert die kognitive Belastung der Programmierer (weniger Dinge - öffentlich, sichtbar - um die man sich kümmern muss).

Obwohl Sie private Eigenschaften mit ES5 emulieren können, kommt das nicht auf eine natürliche/triviale oder sehr lesbare Weise (einige Alternativen sind sogar in Leistungsstrafen enthalten). Sie werden also nicht viel Code in der Umgebung sehen, da JavaScript selbst keine privaten Modifikatoren enthält.

Außerdem sind die Eigenschaften, die in Typoskript als privat gekennzeichnet sind, nur zur Kompilierzeit privat. Da ihre Laufzeit JavaScript ist, das, wie gesagt, nicht weiß, was privat ist, sind sie zugänglich.

+0

Ich war mir nicht bewusst, dass private Eigenschaften in Typescript nur zur Kompilierzeit privat sind, aber das macht Sinn, da der resultierende Code JavaScript ist. Danke für die Klarstellung. – cruzan

1

können Sie die public readonly Schlüsselwort verwenden, um Ihre Klasse zu vereinfachen:

class UnitType { 
 
    constructor(
 
     public readonly code: string, 
 
     public readonly name: string, 
 
     public readonly unitType: string) { 
 
    } 
 
} 
 

 
// Usage: 
 
var type1 = new UnitType("a", "b", "c"); 
 

 
// error TS2450: Left-hand side of assignment expression cannot be a constant or a read-only property. 
 
type1.code = "aa";