Definição
Função: A palavra-chave typedef cria nomes curtos para tipos existentes, chamados também de alias de tipo. O Dart 2.13 passou a suportar todos os tipos; versões antigas aceitavam apenas tipos de função.
Sintaxe: typedef Apelido = TipoOriginal;
Exemplo: typedef IntList = List<int>;. Após essa declaração, você pode usar IntList no lugar de List<int> em qualquer trecho de código.
typedef IntList = List<int>;
IntList il = [1, 2, 3];Code language: Dart (dart)
Suporte a parâmetros genéricos
Alias de tipo aceitam genéricos para simplificar tipos compostos complexos:
typedef ListMapper<X> = Map<X, List<X>>;Code language: Dart (dart)
ListMapper<String> é idêntico ao Map<String, List<String>>, deixando o código mais compacto e legível.
typedef ListMapper<X> = Map<X, List<X>>;
Map<String, List<String>> m1 = {}; // Forma longa e verbosa
ListMapper<String> m2 = {}; // Mesmo tipo, mais curto e compreensívelCode language: Dart (dart)
Alias de tipo para funções
Você pode criar um alias para uma assinatura de função, padronizando o formato das funções no código:
typedef Compare<T> = int Function(T a, T b);Code language: Dart (dart)
Toda função que segue a assinatura (T, T) → int é do tipo Compare<T>. Use o operador is para verificar se o tipo corresponde.
typedef Compare<T> = int Function(T a, T b);
int sort(int a, int b) => a - b;
void main() {
assert(sort is Compare<int>); // Retorna verdadeiro
}
Code language: Dart (dart)
Exemplos práticos
// Declarar alias de tipo
typedef IntList = List<int>;
typedef StringMap = Map<String, dynamic>;
void main() {
// Utilizar o alias diretamente
IntList nums = [10, 20, 30];
StringMap info = {"name": "dart", "version": "2.18"};
print(nums);
print(info);
}Code language: JavaScript (javascript)

// Alias genérico: chave X, valor é lista do tipo X
typedef ListMapper<X> = Map<X, List<X>>;
void main() {
// Forma nativa longa
Map<String, List<String>> oldData = {
"fruit": ["apple", "banana"]
};
// Forma simplificada com typedef, tipos equivalentes
ListMapper<String> newData = {
"fruit": ["apple", "banana"]
};
print(oldData);
print(newData);
}Code language: Dart (dart)

// Alias de função genérico: recebe dois parâmetros T, retorna inteiro
typedef Compare<T> = int Function(T a, T b);
// Função compatível com Compare<int>
int intSort(int a, int b) => a - b;
// Função compatível com Compare<String>
int strSort(String a, String b) => a.length - b.length;
void main() {
// Validação de tipos
assert(intSort is Compare<int>);
assert(strSort is Compare<String>);
// Passar a função como argumento
List<int> arr = [5, 1, 3];
arr.sort(intSort);
print(arr); // Saída: [1, 3, 5]
}Code language: Dart (dart)

typedef (alias de tipo)