Optional Chaining
Le chaînage optionnel a atteint l'étape 3 du TC39 pendant le development
de la version 3.7. Le chaînage optionnel permet d'écrire du code qui va
interrompre l'execution des expressions dès qu'il atteint une valeur
null ou undefined.
Accès aux propriétés d'un objet
Imaginons que nous ayons un album où l'artiste, et sa bio, puissent ne pas
être present dans les données. Par exemple, une compilation pourrait ne pas
avoir qu'un seul artiste.
// Avec le chaînage optionnel,
vous pouvez écrire le code suivant:
type AlbumAPIResponse = {
title: string;
artist?: {
name: string;
bio?: string;
previousAlbums?: string[];
};
};
declare const album: AlbumAPIResponse;
// Dans ce cas ?. agit différemment que le ET logique (&&) car ce dernier traite
les valeur fausses (e.g. une chaîne de caractères vide, 0, Nan et false) de
façon différente.
Le chaînage optionnel va seulement arrêter l'évaluation et retourner undefined
si la valeur est null ou undefined.
Accès à un élément optionnel
Acceder à une propriété se fait avec l'opérateur ., et le chaînage optionnel
marche aussi avec l'opérateur [] pour acceder à des éléments.
const artistBio = album?.artist?.bio;
// A la place de:
const maybeArtistBio = album.artist && album.artist.bio;
// Quand il s'agit d'appeler des fonctions qui peuvent être définies ou non définies,
le chaînage optionnel permet d'appeler la fonction uniquement si elle existe.
Cela peut remplacer le code où l'on écrirait traditionnellement quelque chose comme:
if (func) func()
Par example le chaînage optionnel pour appeler un callback après une requête
vers une API:
const maybeArtistBioElement = album?.["artist"]?.["bio"];
const maybeFirstPreviousAlbum = album?.artist?.previousAlbums?.[0];
// Appel optionnel
// Plus de détails sur le chaînage optionnel dans la version 3.7 sur le blog:
https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/
const callUpdateMetadata = (metadata: any) => Promise.resolve(metadata); // Fake API call
const updateAlbumMetadata = async (metadata: any, callback?: () => void) => {
await callUpdateMetadata(metadata);
callback?.();
};