En javascript, l'opérateur de chaînage facultatif est pris en charge par le plugin babel .
Mais je ne trouve pas comment faire cela en TypeScript. Une idée?
Au moment de l'écriture, TypeScript ne prend pas en charge l'opérateur de chaînage facultatif. Voir la discussion sur le suivi des problèmes de TypeScript: https://github.com/Microsoft/TypeScript/issues/16
Comme avertissement, la sémantique de cet opérateur est toujours très très fluctuante, c'est pourquoi TypeScript ne l'a pas encore ajouté. Le code écrit aujourd'hui contre le plugin Babel peut changer le comportement à l'avenir sans avertissement, conduisant à des bugs difficiles. Je recommande généralement aux gens de ne pas commencer à utiliser une syntaxe dont le comportement n'a pas encore été bien défini.
Bien que TypeScript et la communauté soient en faveur de cet opérateur, jusqu'à ce que TC39 solidifie le proposition actuelle ( qui au moment de la rédaction de cet article est à stage 1
) nous devrons utiliser des alternatives.
Il existe une alternative qui se rapproche du chaînage facultatif sans sacrifier l'outillage de développement : https://github.com/rimeto/ts-optchain
Cet article relate ce que les créateurs ont pu réaliser en essayant de refléter l'opérateur de chaînage natif:
- Utiliser une syntaxe qui reflète étroitement l'accès aux propriétés chaînées
- Offre une expression concise d'une valeur par défaut en cas d'échec de la traversée
- Activer IDE outils de complétion de code et validation du chemin de compilation
En pratique, cela ressemble à ceci:
import { oc } from 'ts-optchain';
// Each of the following pairs are equivalent in result.
oc(x).a();
x && x.a;
oc(x).b.d('Default');
x && x.b && x.b.d || 'Default';
oc(x).c[100].u.v(1234);
x && x.c && x.c[100] && x.c[100].u && x.c[100].u.v || 1234;
Gardez à l'esprit que des alternatives comme celle-ci seront probablement inutiles une fois la proposition adoptée par TypeScript.
Un grand merci également à Ryan Cavanaugh pour tout le travail que vous faites pour défendre cet opérateur auprès de TC39!