Что такое typedef в Dart?

Я прочитал описание, и я понимаю, что это псевдоним типа функции.

  • a typedef, или псевдоним типа функции, дает типу функции имя, которое можно использовать при объявлении полей и возвращаемых типов. Оператор typedef сохраняет информацию о типе, когда тип функции присваивается переменная.

  • http://www.dartlang.org/docs/spec/latest/dart-language-specification.html#kix.yyd520hand9j

но как мне его использовать? Зачем объявлять поля с типом функции? Когда я его использую? Какую проблему это решает?

Я думаю, мне нужен один или два реальных примера кода.

2 ответов


общий шаблон использования typedef в Dart определяет интерфейс обратного вызова. Например:

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');
}

запуск вышеуказанного образца дает следующий результат:

Привет, Мир
2012-09-22 10:19: 15.139: Hello World

в строке typedef говорится, что LoggerOutputFunction принимает Строковый параметр и возвращает void.

timestampLoggerOutputFunction соответствует этому определению и, таким образом, может быть назначен out поле.

Дайте мне знать, если вам нужен другой пример.


Dart 1.24 вводит новый синтаксис typedef, чтобы также поддерживать общие функции. Предыдущий синтаксис по-прежнему поддерживается.

typedef F = List<T> Function<T>(T);

Подробнее см. https://github.com/dart-lang/sdk/blob/master/docs/language/informal/generic-function-type-alias.md

типы функций также могут быть указаны inline

void foo<T, S>(T Function(int, S) aFunction) {...}

см. также https://www.dartlang.org/guides/language/language-tour#typedefs