Angular. Ferdinand Malcher
2015 bietet ein ähnliches Konstrukt: Die Schlüsselwörter get und set verstecken die Methoden, indem eine Eigenschaft an diese gebunden wird. Wird die Eigenschaft gelesen, so wird die dazugehörige Getter-Methode aufgerufen. Beim Befüllen der Eigenschaft mit Werten wird die dazugehörige Setter-Methode aufgerufen.
Praktisch benötigen wir Getter und Setter relativ selten, denn üblicherweise greifen wir immer direkt auf die Eigenschaften einer Klasse zu. Wollen wir allerdings beim Zugriff eine Berechnung durchführen und auf einen Methodenaufruf verzichten, so eignen sich Getter und Setter gut, wie das folgende Beispiel zeigt:
class User {
firstname: string;
lastname: string;
get fullname(): string {
return this.firstname + ' ' + this.lastname;
}
set fullname(name: string) {
const parts = name.split(' ');
this.firstname = parts[0];
this.lastname = parts[1];
}
}
const user = new User();
user.fullname = 'Erika Mustermann';
console.log(user.fullname); // Erika Mustermann
console.log(user); // { firstname: 'Erika', lastname: 'Mustermann' }
Listing 4–5 Klasse mit Getter- und Setter-Methoden
Konstruktoren
Der Konstruktor ist eine besondere Methode, die bei der Instanziierung einer Klasse aufgerufen wird. Er muss immer den Namen constructor() tragen. Der Konstruktor eignet sich dazu, Werte zu empfangen, die für die spätere Verwendung benötigt werden. Solche Werte speichern wir meist in gleichnamigen Propertys der Klasse ab.
class User {
private id: number;
constructor(id: number) {
this.id = id;
}
}
const myUser = new User(3);
Listing 4–6 Klasse mit Konstruktor
Kurzschreibweise für den Konstruktor
TypeScript bietet für diese Syntax eine Kurzschreibweise. Wenn wir in der Methodensignatur des Konstruktors für das Argument einen Zugriffsmodifizierer wie public oder private verwenden, so wird das zugehörige Property automatisch deklariert und initialisiert. Das folgende Codebeispiel führt zum selben Ergebnis wie in Listing 4–6 – ist aber wesentlich kürzer.
class User {
constructor(private id: number) {}
}
Listing 4–7 Konstruktor – vereinfachte Initialisierung von Eigenschaften
Einschränkung: Nur ein Konstruktor pro Klasse
In TypeScript ist nur ein Konstruktor pro Klasse zugelassen. Es ist also nicht möglich, wie in Java oder C# einen Konstruktor mit unterschiedlichen Signaturen anzulegen.
Vererbung
Die Funktionalität einer Klasse kann auf andere Klassen übertragen werden. Dieses Konzept kommt aus der objektorientierten Programmierung und heißt Vererbung. Mit dem Schlüsselwort extends kann eine Klasse von einer anderen erben. Am Beispiel der Klasse User wird die Spezifizierung PowerUser erstellt.
class PowerUser extends User {
constructor(id: string, power: number) {
super(id);
}
}
Listing 4–8 Vererbung
Mit super() kann der Konstruktor der Basisklasse ausgeführt werden. Wird eine Klasse von einer anderen abgeleitet, so können auch Methoden der Basisklasse überschrieben werden. Wird eine abgeleitete Klasse instanziiert, so erhält man von außen auch Zugriff auf Eigenschaften und Methoden der übergeordneten Klassen (sofern diese nicht als private oder protected deklariert wurden).
4.5Interfaces
Format eines Konstrukts definieren
Um die Typisierung in unserem Programmcode konsequent umzusetzen, stellt TypeScript sogenannte Interfaces bereit. Interfaces dienen dazu, die Struktur eines Objekts grundsätzlich zu definieren. Wir können explizit bestimmen, welche Teile enthalten sein müssen und welche Typen sie besitzen sollen. Optionale Eigenschaften werden durch ein Fragezeichen-Symbol gekennzeichnet. Im nachfolgenden Beispiel sehen wir, dass das Interface die Angabe eines Vornamens und Nachnamens erfordert. Das Alter hingegen ist optional und muss nicht angegeben werden.
interface Contact {
firstname: string;
lastname: string;
age?: number;
}
const contact: Contact = {
firstname: 'Max',
lastname: 'Mustermann'
}
Fügen wir dem Objekt eine zusätzliche Eigenschaft hinzu oder hat eine der Eigenschaften nicht den Typen, der im Interface definiert wurde, so erhalten wir einen Fehler.
Interface für Klassen
Interfaces können auch dafür verwendet werden, die Struktur einer Klasse vorzugeben. Dafür wird nach dem Klassennamen das Schlüsselwort implements angefügt, gefolgt vom Namen des Interface. Der Compiler wird nun signalisieren, dass wir alle definierten Eigenschaften und Methoden des Interface implementieren müssen.
interface Human {
name: string;
age: number;
}
class Person implements Human {
name = 'Erika';
age = 25;
}
4.6Template-Strings
Backticks, keine Anführungszeichen
Mit einem normalen String in einfachen Anführungszeichen ist es nicht möglich, einen Text über mehrere Zeilen anzugeben. Ab ECMAScript 2015 gibt es allerdings auch die Möglichkeit, Template-Strings im Code zu nutzen. Ein Template-String wird mit schrägen `Hochkommata` (auch Accent grave oder Backtick) eingeleitet und beendet, nicht mit Anführungszeichen. Der String kann sich schließlich über mehrere Zeilen erstrecken und endet erst beim schließenden Backtick.
Ausdrücke in Strings einbetten