Есть два понятия «универсальный», когда дело доходит до определения типа. Typedef может быть универсальным для типа, или typedef может ссылаться на универсальную функцию (или обе):
typedef, общий для T
:
typedef F<T> = T Function(T);
Тогда в использовании:
F first = (dynamic arg) => arg; // F means F<dynamic>
F<String> second = (String arg) => arg; // F<String> means both T must be String
typedef, который ссылается на универсальную функцию в M
:
typedef F = M Function<M>(M);
Тогда в использовании:
F first = <M>(M arg) => arg; // The anonymous function is defined as generic
// F<String> -> Illegal, F has no generic argument
// F second = (String arg) => arg -> Illegal, the anonymous function is not generic
Или оба:
typedef F<T> = M Function<M>(T,M);
И в использовании:
F first = <M>(dynamic arg1, M arg2) => arg2; // F means F<dynamic> so the T must be dynamic
F<String second = <M>(String arg1, M arg2) => arg2; // The T must be String, the function must still be generic on the second arg and return type