Dies ist in der ECMAScript Optional Chaining-Spezifikation definiert, daher sollten wir uns wahrscheinlich auf optionale Verkettung beziehen, wenn wir darüber diskutieren. Wahrscheinliche Implementierung:
const result = a?.b?.c;
Kurz gesagt, das TypeScript-Team wartet darauf, dass die ECMAScript-Spezifikation präzisiert wird, damit ihre Implementierung in Zukunft nicht brechen wird. Wenn sie jetzt etwas implementieren würden, würden sie möglicherweise größere Änderungen benötigen, wenn ECMAScript ihre Spezifikation neu definieren.
Siehe Optional Chaining-Spezifikation
Wenn etwas niemals Standard-JavaScript werden soll, kann das TypeScript-Team implementieren, wie sie es für richtig halten. Für zukünftige ECMAScript-Ergänzungen möchten sie jedoch die Semantik bewahren, auch wenn sie frühzeitigen Zugriff gewähren, wie sie es für viele andere Funktionen getan haben.
Kurzbefehle
Alle funkigen Operatoren von JavaScript sind verfügbar, einschließlich der Typumwandlungen wie...
var n: number = +myString; // in Zahl umwandeln
var b: bool = !!myString; // in bool umwandeln
Manuelle Lösung
Aber zurück zur Frage. Ich habe ein obskures Beispiel, wie man in JavaScript (und daher TypeScript) etwas Ähnliches machen kann, obwohl ich definitiv nicht behaupte, dass es so elegant ist wie das Feature, nach dem du wirklich suchst.
(foo||{}).bar;
Also, wenn foo
undefined
ist, ist das Ergebnis undefined
und wenn foo
definiert ist und eine Eigenschaft namens bar
hat, die einen Wert hat, ist das Ergebnis dieser Wert.
Ich habe ein Beispiel auf JSFiddle erstellt.
Dies sieht für längere Beispiele ziemlich zwielichtig aus.
var postleitzahl = ((person||{}).adresse||{}).postleitzahl;
Chain-Funktion
Wenn du verzweifelt eine kürzere Version möchtest, während die Spezifikation noch nicht endgültig ist, verwende ich diese Methode manchmal. Sie bewertet den Ausdruck und gibt einen Standardwert zurück, wenn die Verkettung nicht erfüllt werden kann oder null/undefined endet (beachte, dass hier das !=
wichtig ist, wir wollen hier ein wenig positives Hin- und Herschalten).
function chain(exp: () => T, d: T) {
try {
let val = exp();
if (val != null) {
return val;
}
} catch { }
return d;
}
let obj1: { a?: { b?: string }} = {
a: {
b: 'c'
}
};
// 'c'
console.log(chain(() => obj1.a.b, 'Nichts'));
obj1 = {
a: {}
};
// 'Nichts'
console.log(chain(() => obj1.a.b, 'Nichts'));
obj1 = {};
// 'Nichts'
console.log(chain(() => obj1.a.b, 'Nichts'));
obj1 = null;
// 'Nichts'
console.log(chain(() => obj1.a.b, 'Nichts'));