Der Mechanismus des optional chaining (?.) wurde in JavaScript eingeführt, um einen bequemen und sicheren Zugriff auf Eigenschaften und Methoden von Objekten zu ermöglichen, die möglicherweise nicht definiert sind. In TypeScript ist er besonders nützlich, da er hilft, Laufzeitfehler zu vermeiden, die mit dem Zugriff auf Eigenschaften oder Methoden von undefined oder null verbunden sind.
Vor der Einführung des optionalen Chainings mussten Entwickler manuell die Existenz jeder Ebene der Objektverschachtelung überprüfen, was den Code lang und schwer lesbar machte:
if (obj && obj.a && obj.a.b) { // ... }
Beim Zugriff auf verschachtelte Eigenschaften eines nicht definierten Objekts kann ein Laufzeitfehler auftreten: Cannot read property 'x' of undefined. Außerdem erschweren lange Kettenprüfungen die Wartung und Lesbarkeit des Codes.
Optional chaining (?.) ermöglicht den Zugriff auf verschachtelte Eigenschaften, Methoden oder Array-Elemente, wobei automatisch undefined zurückgegeben wird, wenn ein Teil der Kette null oder undefined ist.
Beispielcode:
interface User { name: string; address?: { city?: string; }; } const user: User = { name: 'Ivan' }; console.log(user.address?.city); // undefined
Wichtige Merkmale:
T | undefined, was vom TypeScript-Compiler berücksichtigt wird und hilft, Fehler zu vermeiden.Kann man optional chaining links vom Zuweisungsoperator verwenden? Zum Beispiel: user.address?.city = 'Moscow'?
Nein, optional chaining kann nicht in der linken Ausdrückskomponente einer Zuweisung verwendet werden, das würde einen Kompilationsfehler verursachen. Optional chaining funktioniert nur beim Lesen, nicht beim Schreiben.
Kann man optional chaining verwenden, um eine Methode aufzurufen, wenn das Objekt selbst möglicherweise nicht definiert ist? Zum Beispiel: user?.logInfo()?
Ja, wenn das Objekt vor dem Methodenaufruf undefined/null sein kann, wird der Aufruf user?.logInfo() keinen Fehler auslösen und einfach undefined zurückgeben, wenn user nicht definiert ist.
user?.logInfo(); // wenn user definiert ist, wird logInfo aufgerufen, andernfalls passiert nichts
Was ist der Unterschied zwischen optional chaining und dem alten '&&'-Operator, z.B.: user && user.address && user.address.city?
Optional chaining ist kürzer, funktioniert für alle Typen (einschließlich Methoden und Arrays), und TypeScript berücksichtigt es bei der Typüberprüfung. Wichtig ist, dass Sie beim Verwenden des '&&'-Operators versehentlich nicht true/false oder undefined, sondern den verschachtelten Wert erhalten können. Optional chaining gibt hingegen garantiert entweder den erwarteten Typ oder undefined zurück, was in der Typausgabe berücksichtigt wird.
undefined/null sein können (überflüssiger und nutzloser Code).Im Code werden lange Ketten von optional chaining verwendet, selbst dort, wo die Variablen gemäß der Geschäftslogik immer definiert sind:
order?.customer?.address?.city = 'London';
Vorteile:
Nachteile:
Optional chaining wird nur verwendet, wenn mit externen Daten gearbeitet wird oder in Bereichen, in denen die Werte tatsächlich undefiniert sein können:
const city = apiResponse?.info?.location?.city || 'Unbekannt';
Vorteile:
Nachteile: