🎅 Advent of TypeScript 2024 - Jour 13
The Reindeer Plan Their Attack - Où j'apprends des mots compliqués pour des concepts simples 😂
Aujourd'hui pour la première fois depuis le début de l'événement, je dois me servir des indices, car après avoir cherché et tenté quelques trucs, comme ajouter des champs (ce qui échoue à cause des tests t1
, t2
...), ou passer le champ en readonly
, je n'ai pas la moindre idée des concepts à utiliser ici.
Indice
L'indice traduit nous dit :
Connaissez-vous les termes covariant, contravariant, bivariant, invariant ? Si ce n'est pas le cas, il pourrait être utile de vous renseigner dessus.
Bon, c'était une bonne idée de regarder les indices parce-que je n'ai jamais vu ou entendu ces mots, sauf invariant, mais ça ne m'aide pas beaucoup plus. À partir de là je me lance dans des recherches sur ces termes et ce qu'ils peuvent vouloir dire dans le contexte de TypeScript.
https://shaky.sh/ts-covariance-contravariance/
https://www.sandromaglione.com/articles/covariant-contravariant-and-invariant-in-typescript
https://github.com/microsoft/TypeScript/pull/48240
Solution
Je ne vais pas paraphraser, les articles ci-dessus expliqueront bien mieux que moi ces concepts. Mais pour le TL;DR, si T extends U
, la variance permet de savoir comment F<T>
et F<U>
sont liés :
- Covariant:
F<T> extends F<U>
- Contravariant:
F<U> extends F<T>
- Invariant: Ni covariant ni contravariant
- Bivariant:
F<T> extends F<U>
etF<U> extends F<T>
TypeScript infère très bien tout seul les relations de covariance et de contravariance, mais la version 4.7
ajoute des modificateurs qui permettent d'exprimer la covariance, contravariance ou invariance des paramètres de type, ce qui permet à la fois de forcer la manière dont TypeScript l'aurait inféré, et d'améliorer les performances puisque le type n'aura pas besoin d'être évalué pour inférer la variance.
Donc il suffisait d'ajouter les modificateurs in
et out
au paramètre de type T
, ce qui le rend invariant.
type Demand <in out T > = {
demand : T ;
}
Franchement je vais avoir besoin de revenir sur ces lectures pour être sûr de comprendre à quels cas d'usage classiques correspondent ces modificateurs in
et out
. Car si je comprends la théorie et le fonctionnement, je ne me vois pas encore les utiliser dans des cas plus concrets 🤷
À demain ! 🎄