L'opérateur satisfies ajouté dans la version 4.9 de TypeScript permet de s'assurer qu'une expression corresponde à un type, tout en conservant un type spécifique à l'expression.
Prenons un exemple concret pour mieux comprendre la situation.
On crée une variable qui correspond à la signature et on essaie de l'envoyer à la fonction
Le problème est que TypeScript va inférer un type pour cette variable qui ne correspond pas à notre définition et il renverra une erreur. La solution utilisée jusqu'à maintenant était de forcer le type via un as ou en définissant le type de la variable.
Cela corrige notre problème mais en entraine un autre. On perd la spécificité de notre variable
Notre variable ayant pris le type de Colors, les valeurs sont pour TypeScript de type string | [number, number, number] ce qui ne correspond pas à ce que l'on écrit et c'est là que satisfies intervient !
Gràce à cette instruction plutôt que de convertir le type de colors en Colors TypeScript va inférer un type qui correspond au type demandé tout en gardant la spécificité de notre variable. En interne, le type inféré pour colors sera le suivant :
On correspond bien à Colors tout en gardant une définition qui correspond à la valeur de notre variable.
Quand utiliser as ?
Avec ce nouvel opérateur on peut se demander si as a encore un intérêt. Selon moi as reste intéréssant pour typer un tableau avant son remplissage par exemple.
Mais aussi pour un objet vide que l'on voudrait initialiser comme Record<string, ????>