TypeScript-Typwächter
Typwächter sind eine leistungsstarke Funktion in TypeScript, mit der Entwickler Laufzeitprüfungen durchführen können, um den Typ einer Variablen einzugrenzen. Dies gewährleistet präzisere Typinformationen und führt zu sichererem und vorhersehbarerem Code. In diesem Artikel wird erläutert, was Typwächter sind und wie sie effektiv eingesetzt werden.
Was sind Typwächter?
Typwächter sind Ausdrücke, die Laufzeitprüfungen durchführen und es TypeScript ermöglichen, einen spezifischeren Typ für eine Variable abzuleiten. Sie helfen bei der Unterscheidung zwischen verschiedenen Typen, insbesondere beim Umgang mit Union-Typen. Typwächter können mithilfe verschiedener Techniken implementiert werden, darunter:
- Benutzerdefinierte Typprädikate
- Typzusicherungen
- Instanzprüfungen
- Verwenden des Operators
typeof
- Verwenden des Operators
in
Benutzerdefinierte Typprädikate
Benutzerdefinierte Typprädikate sind Funktionen, die einen booleschen Wert zurückgeben und einen speziellen Rückgabetyp haben, der den Typ der überprüften Variable angibt. So erstellen und verwenden Sie sie:
function isString(value: any): value is string {
return typeof value === 'string';
}
function printString(value: any) {
if (isString(value)) {
console.log(value.toUpperCase()); // TypeScript knows value is a string here
} else {
console.log('Not a string');
}
}
Im obigen Beispiel ist isString
ein benutzerdefiniertes Typprädikat, das TypeScript hilft zu verstehen, dass value
ein String innerhalb des Blocks if
ist.
Typzusicherungen
Typbehauptungen weisen TypeScript an, eine Variable als einen bestimmten Typ zu behandeln. Diese Methode führt keine Laufzeitprüfung durch, sondern informiert den TypeScript-Compiler über den Typ. Beispiel:
function printLength(value: any) {
console.log((value as string).length); // Assert value is a string
}
In diesem Beispiel weist value as string
TypeScript an, davon auszugehen, dass value
ein String ist, ohne eine Laufzeitprüfung durchzuführen.
Instanzprüfungen
Mithilfe von Instanzprüfungen lässt sich feststellen, ob ein Objekt eine Instanz einer bestimmten Klasse ist. Dies ist bei der Arbeit mit Klassen hilfreich, um die Typen einzugrenzen:
class Dog {
bark() { console.log('Woof'); }
}
class Cat {
meow() { console.log('Meow'); }
}
function speak(animal: Dog | Cat) {
if (animal instanceof Dog) {
animal.bark(); // TypeScript knows animal is a Dog here
} else {
animal.meow(); // TypeScript knows animal is a Cat here
}
}
In diesem Beispiel hilft der Operator instanceof
TypeScript dabei, den Typ von animal
basierend auf seiner Klasse abzuleiten.
Verwenden des Operators typeof
Mit dem Operator typeof
können primitive Typen wie string
, number
und boolean
überprüft werden:
function processValue(value: string | number) {
if (typeof value === 'string') {
console.log(value.toUpperCase()); // TypeScript knows value is a string here
} else {
console.log(value.toFixed(2)); // TypeScript knows value is a number here
}
}
Hier wird typeof
verwendet, um zu prüfen, ob value
ein string
oder eine number
ist, und der Typ wird entsprechend eingegrenzt.
Verwenden des Operators in
Der Operator in
prüft, ob eine Eigenschaft in einem Objekt vorhanden ist. Dies ist nützlich, um zwischen Typen zu unterscheiden, die gemeinsame Eigenschaften haben:
interface Bird {
fly: () => void;
}
interface Fish {
swim: () => void;
}
function move(creature: Bird | Fish) {
if ('fly' in creature) {
creature.fly(); // TypeScript knows creature is a Bird here
} else {
creature.swim(); // TypeScript knows creature is a Fish here
}
}
In diesem Beispiel hilft der Operator in
TypeScript dabei, anhand des Vorhandenseins einer Methode zu bestimmen, ob creature
ein Bird
oder ein Fish
ist.
Abschluss
TypeScript-Typwächter sind wichtige Tools für die flexible und sichere Arbeit mit Typen. Sie ermöglichen eine genauere Typprüfung und können Laufzeitfehler verhindern, indem sie sicherstellen, dass in verschiedenen Szenarien der richtige Typ verwendet wird. Das Verstehen und effektive Verwenden von Typwächtern kann zu robusterem und wartungsfreundlicherem TypeScript-Code führen.