Guides approfondis
Templates

Syntaxe des expressions

Les expressions Angular sont basées sur JavaScript, mais en diffèrent sur quelques points clés. Ce guide présente les similitudes et les différences entre les expressions Angular et le JavaScript standard.

Valeurs littérales

Angular prend en charge un sous-ensemble des valeurs littérales de JavaScript.

Valeurs littérales prises en charge

Type de littéral Exemples de valeurs
Chaîne de caractères 'Hello', "World"
Booléen true, false
Nombre 123, 3.14
Objet {name: 'Alice'}
Tableau ['Onion', 'Cheese', 'Garlic']
null null
RegExp /\d+/
Template string `Hello ${name}`
Template string étiquetée tag`Hello ${name}`

Valeurs littérales non prises en charge

Type de littéral Exemples de valeurs
BigInt 1n

Globales

Les expressions Angular prennent en charge les globales suivantes :

Aucune autre globale JavaScript n'est prise en charge. Parmi les globales JavaScript courantes figurent Number, Boolean, NaN, Infinity, parseInt, etc.

Variables locales

Angular met automatiquement à disposition, dans certains contextes, des variables locales spéciales utilisables dans les expressions. Ces variables spéciales commencent toujours par le caractère dollar ($).

Par exemple, les blocs @for fournissent plusieurs variables locales correspondant à des informations sur la boucle, comme $index.

Quels opérateurs sont pris en charge ?

Opérateurs pris en charge

Angular prend en charge les opérateurs suivants du JavaScript standard.

Opérateur Exemple(s)
Addition / Concaténation 1 + 2
Soustraction 52 - 3
Multiplication 41 * 6
Division 20 / 4
Reste (modulo) 17 % 5
Exponentiation 10 ** 3
Parenthèses 9 * (8 + 4)
Conditionnel (ternaire) a > b ? true : false
ET (logique) &&
OU (logique) ||
NON (logique) !
Nullish coalescing possiblyNullValue ?? 'default'
Opérateurs de comparaison <, <=, >, >=, ==, ===, !==, !=
Négation unaire -x
Plus unaire +y
Accesseur de propriété person['name']
typeof typeof 42
void void 1
in 'model' in car
instanceof car instanceof Automobile
Affectation a = b
Affectation après addition a += b
Affectation après soustraction a -= b
Affectation après multiplication a *= b
Affectation après division a /= b
Affectation du reste a %= b
Affectation après exponentiation a **= b
Affectation après ET logique a &&= b
Affectation après OU logique a ||= b
Affectation de nullish coalescing a ??= b
Décomposition dans les littéraux d'objet {...obj, foo: 'bar'}
Décomposition dans les littéraux de tableau [...arr, 1, 2, 3]
Décomposition dans les appels de fonction fn(...args)
Fonction fléchée items.filter((i) => i.active)

Note : Les opérateurs d'affectation et d'incrémentation/décrémentation ne sont valides que dans les instructions d'event listener. Les utiliser dans un binding ou une interpolation provoque une erreur de compilation, sauf s'ils se trouvent dans une fonction fléchée.

Les fonctions fléchées doivent avoir une expression comme corps. Les pipes ne peuvent pas être utilisés dans une fonction fléchée, mais vous pouvez passer une fonction fléchée en argument à un pipe.

Les expressions Angular prennent également en charge les opérateurs non standard suivants :

Opérateur Exemple(s)
Pipe {{ total | currency }}
Chaînage optionnel* someObj.someProp?.nestedProp
Assertion non nulle (TypeScript) someObj!.someProp

Migration de la navigation sécurisée

Avant Angular 22, l'opérateur de chaînage optionnel (?.) renvoyait null lorsque l'opérande de gauche valait null ou undefined, alors que l'opérateur ?. du JavaScript standard renvoie undefined. Depuis Angular 22, le comportement de l'opérateur de chaînage optionnel dans les expressions Angular est aligné sur celui du JavaScript standard.

Lors de la migration vers la v22, les schematics de ng update ont ajouté une fonction magique $safeNavigationMigration aux expressions existantes pour préserver l'ancien comportement qui renvoie null.

{{ $safeNavigationMigration(foo?.bar) }}

$safeNavigationMigration est uniquement une aide temporaire à la migration. Elle indique au compilateur de compiler l'expression de navigation sécurisée qu'elle entoure avec l'ancienne sémantique qui renvoie null plutôt qu'avec la sémantique ?. du JavaScript standard. Ce n'est pas une vraie fonction et elle ne peut pas être appelée depuis TypeScript.

Note : Privilégiez la migration des expressions pour qu'elles ne dépendent plus de la distinction entre null et undefined, afin de pouvoir retirer $safeNavigationMigration. Cette fonction pourrait être supprimée dans une future version d'Angular.

Opérateurs non pris en charge

Opérateur Exemple(s)
Tous les opérateurs bit à bit &, &=, ~, |=, ^=, etc.
Déstructuration d'objet const { name } = person
Déstructuration de tableau const [firstItem] = items
Opérateur virgule x = (x++, x)
new new Car()

Contexte lexical des expressions

Les expressions Angular sont évaluées dans le contexte de la classe du composant ainsi que des variables de template, variables locales et globales pertinentes.

Quand vous faites référence aux membres de la classe du composant, this est toujours implicite. Cependant, si un template déclare une variable de template portant le même nom qu'un membre, la variable masque ce membre. Vous pouvez faire référence sans ambiguïté à un tel membre de la classe en utilisant explicitement this.. Cela peut être utile lors de la création d'une déclaration @let qui masque un membre de la classe, par exemple pour affiner le type d'un signal.

Déclarations

De manière générale, les déclarations ne sont pas prises en charge dans les expressions Angular. Cela inclut, sans s'y limiter :

Déclarations Exemple(s)
Variables let label = 'abc', const item = 'apple'
Fonctions function myCustomFunction() { }
Fonctions fléchées avec un corps en bloc () => { }
Classes class Rectangle { }

Instructions d'event listener

Les event handlers sont des instructions et non des expressions. Bien qu'ils prennent en charge toute la syntaxe des expressions Angular, il existe deux différences clés :

  1. Les instructions prennent en charge les opérateurs d'affectation (mais pas les affectations par déstructuration)
  2. Les instructions ne prennent pas en charge les pipes