Передайте типизированную функцию в качестве параметра в Dart

Я знаю, что класс Function может передаваться как параметр другой функции, например:

void doSomething(Function f) {
    f(123);
}

Но есть ли способ ограничить аргументы и возвращаемый тип параметра функции?

Например, в этом случае f вызывается непосредственно на целое число, но что, если это функция, принимающая другой тип?

Я попытался передать его как Function<Integer>, но функция не является параметрическим типом.

Есть ли другой способ указать подпись функции, передаваемой в качестве параметра?

Ответ 1

В Dart v1.23 добавлен новый синтаксис для написания типов функций, который также работает in-line.

void doSomething(Function(int) f) {
  f(123);
}

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

void doSomething(Function(int) f) {
  Function(int) g = f;
  g(123);
}

var x = new List<int Function(int)>[];

int Function(int) returnsAFunction() => (int x) => x + 1;

Ответ 2

Изменение: Обратите внимание, что этот ответ содержит устаревшую информацию. См. Ответ Irn для получения более актуальной информации.

Чтобы развернуть ответ Рэндала, ваш код может выглядеть примерно так:

typedef void IntegerArgument(int x);

void doSomething(IntegerArgument f) {
    f(123);
}

Function<int> кажется, что это была бы хорошая идея, но проблема в том, что мы можем указать тип возвращаемого значения, а также тип произвольного количества аргументов.

Ответ 3

У вас может быть параметр с параметром функции или использовать typedef

void main() {
  doSomething(xToString);
  doSomething2(xToString);
}

String xToString(int s) => 's';

typedef String XToStringFn(int s);

void doSomething(String f(int s)) {
    print('value: ${f(123)}');
}

void doSomething2(XToStringFn f) {
    print('value: ${f(123)}');
}

Пример DartPad

Ответ 5

Для справки.

int execute(int func(int a, int b)) => func(4, 3);

print(execute((a, b) => a + b));