Article original : JavaScript Optional Chaining `?.` Explained - How it Works and When to Use it
Qu'est-ce que le chaînage optionnel ?
Le chaînage optionnel, représenté par ?. en JavaScript, est une nouvelle fonctionnalité introduite dans ES2020.
Le chaînage optionnel modifie la manière d'accéder aux propriétés d'objets profondément imbriqués. Il résout le problème des multiples vérifications de nullité lors de l'accès à une longue chaîne de propriétés d'objet en JavaScript.
Statut actuel : Proposition ECMAScript à l'étape 4 du processus. : https://github.com/tc39/proposal-optional-chaining
Cas d'usage
- Accéder à des propriétés potentiellement
nullouundefinedd'un objet. - Obtenir des résultats d'une variable qui peut ne pas être encore disponible.
- Obtenir des valeurs par défaut.
- Accéder à de longues chaînes de propriétés.
Imaginez que vous attendiez qu'une API retourne un objet de ce type :
obj = {
prop1: {
prop2: {
someProp: "value"
}
}
};
Mais vous ne savez peut-être pas si chacun de ces champs est disponible à l'avance. Certains peuvent ne pas avoir été renvoyés par l'API, ou peuvent être revenus avec des valeurs null.
Voici un exemple :
//attendu
obj = {
id: 9216,
children: [
{ id: 123, children: null },
{ id: 124, children: [{ id: 1233, children: null }] }
]
};
//réel
obj = {
id: 9216,
children: null
};
Cela arrive très souvent avec les fonctions qui appellent des API. Vous avez peut-être vu du code dans React qui tente de se prémunir contre ces problèmes comme ceci :
render = () => {
const obj = {
prop1: {
prop2: {
someProp: "value",
},
},
};
return (
<div>
{obj && obj.prop1 && obj.prop1.prop2 && obj.prop1.prop2.someProp && (
<div>{obj.prop1.prop2.someProp}</div>
)}
</div>
);
};
Pour mieux se préparer à ce problème, nous avons souvent utilisé Lodash dans le passé, spécifiquement la méthode _.get :
_.get(obj, 'prop1.prop2.someProp');
Cela retourne undefined si l'une de ces propriétés est undefined. Le chaînage optionnel est exactement cela ! Maintenant, au lieu d'utiliser une bibliothèque externe, cette fonctionnalité est intégrée.
Comment fonctionne le chaînage optionnel ?
?. peut être utilisé pour enchaîner des propriétés qui peuvent être null ou undefined.
const propNeeded = obj?.prop1?.prop2?.someProp;
Si l'une de ces propriétés enchaînées est null ou undefined, JavaScript retournera undefined.
Que faire si nous voulons retourner quelque chose de significatif ? Essayez ceci :
let familyTree = {
us: {
children: {}
}
}
// avec _.get
const grandChildren = _.get(familyTree, 'us.children.theirChildren', 'got no kids' );
//avec chaînage optionnel et coalescence de null
const nullCoalescing = familyTree?.us?.children?.theirChildren ?? 'got no kids'
console.log(nullCoalescing) //got no kids
Cela fonctionne également pour les objets qui peuvent être null ou undefined :
let user;
console.log(user?.id) // undefined
Comment obtenir cette nouvelle fonctionnalité
Essayez-la dans la console de votre navigateur : Il s'agit d'une ajout récent et les anciens navigateurs peuvent nécessiter des polyfills. Vous pouvez l'essayer dans Chrome ou Firefox dans la console du navigateur. Si cela ne fonctionne pas, essayez d'activer les fonctionnalités expérimentales de JavaScript en visitant
chrome://flags/et en activant "Experimental JavaScript".Essayez-la dans votre application Node en utilisant Babel :
{ "plugins": ["@babel/plugin-proposal-optional-chaining"] }
Ressources
- https://dmitripavlutin.com/javascript-optional-chaining/
- Documentation de Babel : https://babeljs.io/docs/en/babel-plugin-proposal-optional-chaining
TL;DR
Utilisez le chaînage optionnel ?. pour les objets ou les longues chaînes de propriétés qui peuvent être null ou undefined. La syntaxe est la suivante :
let user = {};
console.log(user?.id?.name)
Intéressé par plus de tutoriels et JSBytes de ma part ? Inscrivez-vous à ma newsletter. ou suivez-moi sur Twitter