#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. Если в функции тип переменной выведен правильно, см. Обновленный код