Extension Types

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:

  1. Constructor implícito IdNumber(int id)
  2. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *