J'ai lu la description et je comprends qu'il s'agit d'un alias de type fonction.
Un typedef, ou alias de type de fonction, donne à un type de fonction un nom que vous pouvez utiliser lors de la déclaration de champs et de types de retour. Un typedef conserve les informations de type lorsqu'un type de fonction est affecté à une variable.
http://www.dartlang.org/docs/spec/latest/Dart-language-specification.html#kix.yyd520hand9j
Mais comment l'utiliser? Pourquoi déclarer des champs avec un type de fonction? Quand dois-je l'utiliser? Quel problème résout-il?
Je pense que j'ai besoin d'un ou deux exemples de code réel.
Un modèle d'utilisation courant de typedef dans Dart définit une interface de rappel. Par exemple:
typedef void LoggerOutputFunction(String msg);
class Logger {
LoggerOutputFunction out;
Logger() {
out = print;
}
void log(String msg) {
out(msg);
}
}
void timestampLoggerOutputFunction(String msg) {
String timeStamp = new Date.now().toString();
print('${timeStamp}: $msg');
}
void main() {
Logger l = new Logger();
l.log('Hello World');
l.out = timestampLoggerOutputFunction;
l.log('Hello World');
}
L'exécution de l'exemple ci-dessus donne la sortie suivante:
Bonjour le monde
2012-09-22 10: 19: 15.139: Bonjour tout le monde
La ligne typedef indique que LoggerOutputFunction prend un paramètre String et renvoie void.
timestampLoggerOutputFunction correspond à cette définition et peut donc être affecté au champ out.
Faites-moi savoir si vous avez besoin d'un autre exemple.
Dart 1.24 introduit une nouvelle syntaxe typedef pour également prendre en charge les fonctions génériques. La syntaxe précédente est toujours prise en charge.
typedef F = List<T> Function<T>(T);
Pour plus de détails, voir https://github.com/Dart-lang/sdk/blob/master/docs/language/informal/generic-function-type-alias.md
Les types de fonction peuvent également être spécifiés en ligne
void foo<T, S>(T Function(int, S) aFunction) {...}
Voir aussi https://www.dartlang.org/guides/language/language-tour#typedefs
Réponse juste légèrement modifiée, selon la dernière syntaxe typedef, l'exemple pourrait être mis à jour pour:
typedef LoggerOutputFunction = void Function(String msg);
class Logger {
LoggerOutputFunction out;
Logger() {
out = print;
}
void log(String msg) {
out(msg);
}
}
void timestampLoggerOutputFunction(String msg) {
String timeStamp = new Date.now().toString();
print('${timeStamp}: $msg');
}
void main() {
Logger l = new Logger();
l.log('Hello World');
l.out = timestampLoggerOutputFunction;
l.log('Hello World');
}
typedef LoggerOutputFunction = void Function(String msg);
cela semble beaucoup plus clair que la version précédente