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

#dart #type-inference

#dart #вывод типа

Вопрос:

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

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

 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);

 

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

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

Редактировать:

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

например

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

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

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

 

Ответ №1:

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

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

 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);
 

Комментарии:

1. Намерение правильное, я хочу подождать хотя бы продолжительность, прежде чем возвращать значение

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

3. Если в функции тип переменной выведен правильно, см. Обновленный код