Ключевое слово typedef
Ключевое слово typedef создает псевдоним
(синоним) для типа. Чаще всего оно используется
для объявления типа функции, чтобы не писать
длинную сигнатуру каждый раз. Первым параметром
после слова typedef указывается имя нового
типа, вторым - существующий тип, для которого
создается псевдоним.
Синтаксис
typedef TypeName = ExistingType;
Пример
Давайте объявим псевдоним для типа функции,
принимающей две переменные типа int
и возвращающей int:
typedef IntOperation = int Function(int a, int b);
int sum(int a, int b) => a + b;
int mul(int a, int b) => a * b;
int apply(IntOperation op, int a, int b)
{
return op(a, b);
}
void main()
{
IntOperation op = sum;
print(apply(op, 2, 3));
print(apply(mul, 2, 3));
}
Результат выполнения кода:
5
6
Пример
Давайте объявим псевдоним для типа функции без параметров, возвращающей строку, и вызовем ее:
typedef StringGetter = String Function();
String hello()
{
return 'abcde';
}
void main()
{
StringGetter getter = hello;
print(getter());
}
Результат выполнения кода:
"abcde"
Пример
Начиная с Dart 2.13, typedef можно
использовать не только для функций, но и для
любых типов. Давайте объявим псевдонимы для
списка и для отображаемого типа:
typedef IntList = List<int>;
typedef IntMap = Map<String, int>;
void main()
{
IntList list = [1, 2, 3, 4, 5];
IntMap map = {'a': 1, 'b': 2};
print(list);
print(map);
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
{a: 1, b: 2}
Пример
Давайте объявим псевдоним для функции, которая принимает другую функцию в качестве параметра (функция высшего порядка):
typedef Mapper = int Function(int);
typedef Applier = int Function(int, Mapper);
int apply(int value, Mapper fn)
{
return fn(value);
}
int doubleValue(int x) => x * 2;
void main()
{
Applier applier = apply;
print(applier(5, doubleValue));
}
Результат выполнения кода:
10