説明を読み、関数型のエイリアスであることを理解しました。
Typedefまたは関数型のエイリアスは、関数型に、フィールドと戻り値の型を宣言するときに使用できる名前を付けます。 typedefは、関数タイプが変数に割り当てられたときにタイプ情報を保持します。
http://www.dartlang.org/docs/spec/latest/Dart-language-specification.html#kix.yyd520hand9j
しかし、それをどのように使用しますか?関数型でフィールドを宣言する理由いつ使用しますか?それはどのような問題を解決しますか?
1つまたは2つの実際のコード例が必要だと思います。
Dartでのtypedefの一般的な使用パターンは、コールバックインターフェイスの定義です。例えば:
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がStringパラメーターを取り、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 を参照してください
関数タイプもインラインで指定できます
void foo<T, S>(T Function(int, S) aFunction) {...}
参照 https://www.dartlang.org/guides/language/language-tour#typedefs
最新のtypedef構文によると、ほんの少し変更された答え、例は次のように更新できます。
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);
これは以前のバージョンよりもはるかに明確に見えます