Encapsulé à la compilation, sans objet supplémentaire à l’exécution (aucun surcoût). Il permet d’attribuer une nouvelle interface statique aux types existants et de limiter les méthodes accessibles.
Différence avec les Extensions classiques : les extensions standards ajoutent des méthodes à toutes les instances du type de base ; un Extension Type ne s’applique que quand le type statique correspond à ce type d’extension.
// int est le type de représentation, id désigne la valeur brute sous-jacente
extension type IdNumber(int id) {
operator <(IdNumber other) => id < other.id;
}Langage du code : Dart (dart)
Éléments générés automatiquement :
- Constructeur implicite
IdNumber(int id) - Getter :
int get id
Deux modes principaux (les plus utilisés)
1) Mode opaque
Interface isolée|Conseillé pour les contraintes métier
Ne pas écrire le mot-clé implements
Masque les méthodes du type sous-jacent pour appliquer des restrictions d’interface
Aucune affectation directe autorisée entre ce type et le type de base
extension type IdNumber(int id) {
operator <(IdNumber other) => id < other.id;
}
void main() {
final id = IdNumber(100);
id + 5; // Erreur compilation : pas d'opérateur +, l'addition int est masquée
final int raw = id; // Erreur, affectation directe interdite
final int raw = id as int; // Cast explicite pour récupérer la valeur brute
}Langage du code : PHP (php)
2) Mode transparent
implements type-de-représentation
Hérite automatiquement de tous les membres du type sous-jacent ; seul l’ajout ou la redéfinition de méthodes est permis
extension type Num(int v) implements int {
Num square() => Num(v * v);
}
void main() {
final n = Num(5);
print(n.isNegative); // Les méthodes natives de int sont directement exploitables
}Langage du code : Dart (dart)
Utilisation des constructeurs
Le paramètre entre parenthèses constitue le constructeur par défaut, il peut être masqué en mode privé grâce à ._
extension type Id._(int _raw) {
// Le code externe ne peut utiliser que ce constructeur nommé ; appel direct Id(xxx) interdit
Id.create(int value) : _raw = value;
}Langage du code : JavaScript (javascript)
Éléments autorisés : méthodes, getters, setters, opérateurs
Éléments interdits : variables d’instance, membres abstraits
Extension Types