Вывод типа в функции dart curried

Я знаю, что система типов Typescript позволяет делать довольно сложные выводы, и мне интересно, как далеко я могу толкать дротик.

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

Future<T> Function(Future<T> fut) delay<T>(Duration dur) =>
    (fut) async => (await Future.wait(
          [Future.delayed(dur), fut],
        ))[1] as T;

Проблема в том, что я должен передать T функции задержки, например:

final delayedPosition<Position>(Duration(seconds: 3));


// later
await delayedPosition(someFutureThatReturnsAPosition);

В идеале я бы хотел, чтобы Дарт сделал вывод о типе, который возвращается в будущем, чтобы мне не приходилось указывать его самому.

Это возможно? Если да, то как это будет выглядеть?

РЕДАКТИРОВАТЬ:

Чтобы было ясно, я хочу не делать delay универсальным, а тип возвращаемого значения функции, возвращаемой из delay, выводится из его аргумента. Кажется, это вызывает путаницу.

e.g.


// declare delay - I don't know what it should look like

final thingThatDelaysAFutureBy3Seconds = delay(Duration(seconds: 3));

// later
final valFromFuture = await thingThatDelaysAFutureBy3Seconds(someFuture);


person Adam    schedule 26.12.2020    source источник


Ответы (1)


Я не уверен, в чем проблема, невозможно вывести тип из предоставленной вами функции, поскольку нет контекста, в котором используется T, который можно использовать для определения типа.

Кроме того, отправленный вами пример кода недействителен, и вы не ждете 5 секунд перед запуском будущего, а ждете 5 секунд, прежде чем вернуть будущее значение (но оно запускается одновременно с задержкой), если вы хотите запустить будущее после того, как пройдена задержка, вы должны вместо этого использовать:

Future<T> Function(Future<T> fut) delay<T>(Duration dur) => (fut) async {
      await Future.delayed(dur);
      return fut;
    };

Пример:

Future<void> main(List<String> arguments) async {
  var f = delay<int>(Duration(seconds: 5));
  var v = await f(f1()); // Inferred as int
  print(v);
}

Future<int> f1() => Future.value(1);
person Mattia    schedule 26.12.2020
comment
Намерение правильное, я хочу подождать хотя бы продолжительность, прежде чем возвращать значение - person Adam; 26.12.2020
comment
Что я хотел бы сделать, так это просто передать будущее любого типа каррированной функции и получить тип возвращаемого значения, выведенный из переданного ей аргумента. - person Adam; 26.12.2020
comment
Если вы используете функцию, тип переменной определен правильно, см. Обновленный код - person Mattia; 26.12.2020