Questo è definito nelle specifiche del concatenamento opzionale ECMAScript, quindi dovremmo probabilmente fare riferimento al concatenamento opzionale quando ne discutiamo. Probabile implementazione:
const result = a?.b?.c;
Il lungo e breve di questo è che il team di TypeScript sta aspettando che le specifiche ECMAScript vengano rafforzate, quindi la loro implementazione potrebbe non essere interrotta in futuro. Se implementassero qualcosa adesso, finirebbe per richiedere grandi cambiamenti se ECMAScript ridefinisse le loro specifiche.
Vedi le specifiche di concatenamento opzionali
Laddove qualcosa non sarà mai standard JavaScript, il team di TypeScript può implementare come meglio crede, ma per future aggiunte di ECMAScript, vogliono preservare la semantica anche se danno accesso anticipato, come hanno fatto per tante altre funzionalità.
Tagli corti
Quindi sono disponibili tutti gli operatori funky di JavaScripts, incluse le conversioni di tipo come ...
var n: number = +myString; // convert to number
var b: bool = !!myString; // convert to bool
Soluzione manuale
Ma torniamo alla domanda. Ho un esempio ottuso di come puoi fare una cosa simile in JavaScript (e quindi in TypeScript) anche se non sto assolutamente suggerendo che sia una grazia come la funzionalità che stai veramente cercando.
(foo||{}).bar;
Quindi se foo
è undefined
il risultato è undefined
e se foo
è definito e ha una proprietà denominata bar
che ha un valore, il risultato è quel valore.
Ho fatto un esempio su JSFiddle .
Questo sembra abbastanza impreciso per esempi più lunghi.
var postCode = ((person||{}).address||{}).postcode;
Funzione a catena
Se sei alla disperata ricerca di una versione più breve mentre le specifiche sono ancora in sospeso, utilizzo questo metodo in alcuni casi. Valuta l'espressione e restituisce un valore predefinito se la catena non può essere soddisfatta o finisce nullo / indefinito (nota che !=
qui è importante, non vogliamo usarlo !==
perché vogliamo un po 'di giocoleria positiva qui).
function chain<T>(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, 'Nothing'));
obj1 = {
a: {}
};
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = {};
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = null;
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));