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:
- Construtor implícito
IdNumber(int id) - 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