Ceci est défini dans la spécification de chaînage facultatif ECMAScript, nous devrions donc probablement faire référence au chaînage facultatif lorsque nous en discuterons. Mise en œuvre probable:
const result = a?.b?.c;
Le long et le court de celui-ci est que l'équipe TypeScript attend que la spécification ECMAScript soit resserrée, de sorte que leur implémentation puisse être ininterrompue à l'avenir. S'ils implémentaient quelque chose maintenant, cela finirait par nécessiter des changements majeurs si ECMAScript redéfinissait leurs spécifications.
Voir spécification de chaînage facultative
Là où quelque chose ne sera jamais du JavaScript standard, l'équipe TypeScript peut implémenter comme bon lui semble, mais pour les futurs ajouts ECMAScript, ils veulent préserver la sémantique même s'ils donnent un accès anticipé, comme ils l'ont fait pour tant d'autres fonctionnalités.
Raccourcis
Ainsi, tous les opérateurs funky JavaScripts sont disponibles, y compris les conversions de type telles que ...
var n: number = +myString; // convert to number
var b: bool = !!myString; // convert to bool
Solution manuelle
Mais revenons à la question. J'ai un exemple obtus de la façon dont vous pouvez faire une chose similaire en JavaScript (et donc TypeScript), bien que je ne suggère certainement pas que c'est une grâce car la fonctionnalité que vous recherchez vraiment.
(foo||{}).bar;
Donc, si fooest undefinedle résultat est undefinedet si fooest défini et possède une propriété nommée barqui a une valeur, le résultat est cette valeur.
Je mets un exemple sur JSFiddle .
Cela semble assez sommaire pour des exemples plus longs.
var postCode = ((person||{}).address||{}).postcode;
Fonction chaîne
Si vous cherchez désespérément une version plus courte alors que les spécifications sont toujours en suspens, j'utilise cette méthode dans certains cas. Il évalue l'expression et renvoie une valeur par défaut si la chaîne ne peut pas être satisfaite ou se retrouve nulle / non définie (notez que !=c'est important ici, nous ne voulons pas l'utiliser !==car nous voulons un peu de jonglage positif ici).
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'));