Se empaqueta en tiempo de compilación y no crea objetos adicionales en tiempo de ejecución (sin sobrecarga). Sirve para asignar un nuevo conjunto de interfaces estáticas a tipos existentes y limitar los métodos disponibles.
Diferencia con las Extensiones convencionales: las extensiones normales añaden métodos a todas las instancias del tipo base; un Extension Type solo surte efecto cuando el tipo estático coincide con este tipo de extensión.
// int es el tipo de representación, id hace referencia al valor subyacente
extension type IdNumber(int id) {
operator <(IdNumber other) => id < other.id;
}Lenguaje del código: Dart (dart)
Elementos generados automáticamente:
- Constructor implícito
IdNumber(int id) - Getter:
int get id
Dos modos principales (los más utilizados)
1) Modo opaco
Interfaz aislada|Recomendado para restricciones de negocio
Omitir la palabra reservada implements
Oculta los métodos del tipo base para imponer límites de interfaz
No se permite asignar directamente entre el tipo de extensión y el tipo base
extension type IdNumber(int id) {
operator <(IdNumber other) => id < other.id;
}
void main() {
final id = IdNumber(100);
id + 5; // Error de compilación: no existe operador +, se oculta la suma de int
final int raw = id; // Error, asignación directa prohibida
final int raw = id as int; // Conversión explícita para obtener el valor original
}Lenguaje del código: PHP (php)
2) Modo transparente
implements tipo-de-representación
Hereda automáticamente todos los miembros del tipo base; solo se pueden añadir o sobrescribir métodos
extension type Num(int v) implements int {
Num square() => Num(v * v);
}
void main() {
final n = Num(5);
print(n.isNegative); // Se pueden invocar directamente los métodos nativos de int
}Lenguaje del código: Dart (dart)
Uso de constructores
El parámetro entre paréntesis es el constructor predeterminado y se puede ocultar de forma privada mediante ._
extension type Id._(int _raw) {
// El código externo solo puede usar este constructor con nombre; no se permite llamar directamente Id(xxx)
Id.create(int value) : _raw = value;
}Lenguaje del código: JavaScript (javascript)
Elementos soportados: métodos, getters, setters, operadores
Elementos prohibidos: variables de instancia, miembros abstractos
Extension Types