Type branding

Meme avec un contrôle strict de typescript, il arrive un moment ou le typage fort montre ses limites. Cela se produit lorsque l'on travaille avec des primitives. Typescript vous empêchera nativement d'affecter un string a un nombre. Mais il existe une telle variété de format de nombre et de chaîne texte... Comment empêcher l'affection de format ou de donnees incohérentes ?

C'est la que le concept de branding type intervient !

Le principe est simple. Il s'agit de créer un alias sur une primitive. Un alias seul ne suffit toutefois pas a garantir la coherence.

// la propriété brand est facultative ce qui permet l'affectation de primitive
// l'utilisation de symbole unique garanti l'unicité du type
type USD = number & { readonly brand?: unique symbol }
type EUR = number & { readonly brand?: unique symbol }


const eur = 10 as EUR // le cast est possible mais n'offre aucun intérêt

const usd: USD = 10; // vous pouvez affecter une primitive sans avoir a la caster
let usd2: USD = 10;
usd2 = usd; // pas de bug


function euroToUsd(euro: EUR): USD {
    return (euro * 1.18 as USD);
}

console.log({USD: ${euroToUsd(usd)}}); // BUG car les propriétés 'brand' diffèrent

Les applications sont multiples:

  • ID (clé primaire ou secondaire)
  • devises différentes
  • formats différents
  • ...

Cela vous évitera surtout de créer un bug critique par négligence.