Type Guards: in & instanceof
Teil des Abschnitts Einführung in TypeScript der JavaScript-Journey von Coddy. Lektion 69 von 73.
Bei der Arbeit mit Union-Typen musst du häufig feststellen, mit welchem spezifischen Typ du es zu tun hast, bevor du sicher auf typspezifische Eigenschaften oder Methoden zugreifen kannst. Typwächter bieten eine sichere Möglichkeit, Typen zur Laufzeit einzugrenzen.
Der in-Operator prüft, ob eine Eigenschaft in einem Objekt existiert. Dies ist besonders nützlich, wenn Sie eine Union von Objekttypen mit unterschiedlichen Eigenschaften haben:
type Dog = { name: string; breed: string };
type Cat = { name: string; meow: () => void };
function petSound(pet: Dog | Cat) {
if ('breed' in pet) {
// TypeScript weiß hier, dass pet ein Dog ist
console.log(`${pet.name} is a ${pet.breed}`);
} else {
// TypeScript weiß hier, dass pet eine Cat ist
pet.meow();
}
}Der instanceof-Operator prüft, ob ein Objekt von einer bestimmten Konstruktorfunktion oder Klasse erstellt wurde. Obwohl wir Klassen noch nicht behandelt haben, ist dieser Operator nützlich, wenn man mit integrierten JavaScript-Objekten oder benutzerdefinierten Klassen arbeitet:
function processValue(value: string | Date) {
if (value instanceof Date) {
// TypeScript weiß, dass value ein Date ist
console.log(value.getFullYear());
} else {
// TypeScript weiß, dass value ein string ist
console.log(value.toUpperCase());
}
}Beide Operatoren helfen dem TypeScript-Compiler zu verstehen, mit welchem Typ Sie arbeiten, und ermöglichen so den sicheren Zugriff auf typspezifische Eigenschaften und Methoden.
Aufgabe
EinfachErstelle eine Funktion, die verschiedene Medienelemente verarbeitet und den in-Operator verwendet, um zwischen ihnen zu unterscheiden.
Erstelle zwei Typ-Aliase:
Moviemit den Eigenschaftentitle(Zeichenkette) unddirector(Zeichenkette)Songmit den Eigenschaftentitle(Zeichenkette) undartist(Zeichenkette)
Erstelle eine Funktion namens getMediaInfo, die:
- einen Parameter
mediavom TypMovie | Songentgegennimmt - den
in-Operator verwendet, um zu prüfen, ob die Eigenschaftdirectorexistiert "Movie: [title] directed by [director]"zurückgibt, wenn es sich um einen Film handelt"Song: [title] by [artist]"zurückgibt, wenn es sich um ein Lied handelt- einen expliziten Rückgabetyp
stringbesitzt
Erstelle eine zweite Funktion namens processValue, die:
- einen Parameter
valuevom Typstring | Dateentgegennimmt - den
instanceof-Operator verwendet, um zu prüfen, obvalueeinDateist - das Jahr als Zahl zurückgibt, wenn es sich um ein Datum handelt (unter Verwendung von
getFullYear()) - die Länge der Zeichenkette als Zahl zurückgibt, wenn es sich um eine Zeichenkette handelt
- einen expliziten Rückgabetyp
numberbesitzt
Erstelle Testdaten:
movie1:{ title: "Inception", director: "Christopher Nolan" }song1:{ title: "Bohemian Rhapsody", artist: "Queen" }movie2:{ title: "The Matrix", director: "The Wachowskis" }song2:{ title: "Imagine", artist: "John Lennon" }testDate:new Date("2023-12-25")testString:"TypeScript"
Gib die folgenden Ausgaben aus:
- Rufe
getMediaInfomitmovie1auf - Rufe
getMediaInfomitsong1auf - Rufe
getMediaInfomitmovie2auf - Rufe
getMediaInfomitsong2auf - Rufe
processValuemittestDateauf - Rufe
processValuemittestStringauf
Probier es selbst
// TODO: Schreiben Sie hier Ihren Code
// Erstellen Sie Typ-Aliase für Movie und Song
// Erstellen Sie die Funktion getMediaInfo
// Erstellen Sie die Funktion processValue
// Testdaten erstellen
const movie1 = { title: "Inception", director: "Christopher Nolan" };
const song1 = { title: "Bohemian Rhapsody", artist: "Queen" };
const movie2 = { title: "The Matrix", director: "The Wachowskis" };
const song2 = { title: "Imagine", artist: "John Lennon" };
const testDate = new Date("2023-12-25");
const testString = "TypeScript";
// Die Ausgaben ausgeben
console.log(getMediaInfo(movie1));
console.log(getMediaInfo(song1));
console.log(getMediaInfo(movie2));
console.log(getMediaInfo(song2));
console.log(processValue(testDate));
console.log(processValue(testString));Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Einführung in TypeScript
1Erste Schritte mit TS
Was ist TypeScript?Warum TypeScript verwenden?Dein erster TypeScript-CodeKompilierungsprozess & FehlerZusammenfassung: Einführung in TS4Arbeiten mit Funktionen
Typisierung von Parametern & RückgabewertenTypisierung von Arrow-FunktionenDer Rückgabetyp 'void'Optionale Parameter mit '?'Standard-ParameterwerteTypisierung von Rest-ParameternDefinieren von FunktionstypenZusammenfassung: Typisierte Funktionen erstellen2Basis-Typen
Basis-Typen: str, num, booleanDer 'any'-Typ: Der NotausgangDer 'unknown'-TypArbeiten mit 'null' & 'undef'Typinferenz in der PraxisExplizite Typ-AnnotationenZusammenfassung: Übung zu Basis-Typen5Typen: Aliase, Unions & Intersections
Typ-Aliase für primitive DatentypenUnion-Typen ('|')Arbeiten mit Union-TypenLiteral-TypenIntersection-Typen ('&')Kombinieren von Typ-AliasenZusammenfassung: Fortgeschrittene Typ-Kombinationen8Enums
Was ist ein numerisches Enum?Numerische Enums verwendenWas ist ein String-Enum?String-Enums verwendenHeterogene EnumsZusammenfassung: Enums verwenden11Fortgeschrittene Themen
Type AssertionsType Guards: in & instanceofDer 'never'-TypNullable Types ('strictNull')Index-Signaturen für ObjekteRecap: Typen verfeinern3Datenstruktur: Arrays & Tupel
Typisierte Arrays'readonly'-Modifikator für ArraysWas ist ein Tupel?Deklarieren von und Zugriff auf TupelDestrukturierung von TupelnReadonly-TupelMehrdimensionale typisierte ArraysSpread-Operator mit ArraysZusammenfassung: Arrays und TupelÜbe selbstständig: Online-JavaScript-Compiler