Extension Types

Empacotado em tempo de compilação, sem objetos extras em tempo de execução (custo zero). Serve para atribuir um novo conjunto de interfaces estáticas aos tipos originais e restringir os métodos acessíveis.

Diferença em relação às Extensions comuns: extensões convencionais adicionam métodos para todas as instâncias do tipo base; um Extension Type só entra em vigor quando o tipo estático corresponde a esse tipo de extensão.

// int é o tipo de representação, id representa o valor bruto subjacente
extension type IdNumber(int id) {
  operator <(IdNumber other) => id < other.id;
}Code language: Dart (dart)

Membros gerados automaticamente:

  1. Construtor implícito IdNumber(int id)
  2. Getter: int get id

Dois modos principais (mais utilizados)

1) Modo opaco

Interface isolada|Recomendado para restrições de regra de negócio

Não incluir a palavra-chave implements

Oculta métodos do tipo base para aplicar restrições de interface

Não é possível fazer atribuição direta entre o tipo de extensão e o tipo base

extension type IdNumber(int id) {
  operator <(IdNumber other) => id < other.id;
}

void main() {
  final id = IdNumber(100);
  id + 5;          // Erro de compilação: sem operador +, soma de int é ocultada
  final int raw = id; // Erro, atribuição direta não permitida
  final int raw = id as int; // Conversão explícita para recuperar valor bruto
}Code language: PHP (php)

2) Modo transparente

implements tipo-de-representação

Herda automaticamente todos os membros do tipo base; apenas adição ou sobrescrita de métodos é permitida

extension type Num(int v) implements int {
  Num square() => Num(v * v);
}

void main() {
  final n = Num(5);
  print(n.isNegative); // Métodos nativos de int podem ser chamados diretamente
}Code language: Dart (dart)

Formas de uso dos construtores

O parâmetro entre parênteses é o construtor padrão, pode ser privado e ocultado com ._

extension type Id._(int _raw) {
  // Código externo só pode usar este construtor nomeado; chamada direta Id(xxx) bloqueada
  Id.create(int value) : _raw = value;
}Code language: JavaScript (javascript)

Suportado: métodos, getters, setters, operadores

Não permitido: variáveis de instância, membros abstratos

Extension Types

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *