我知道类型记录的类型系统允许一些非常复杂的推论,我想知道我能推动多远的飞镖。
我想要创建一个简单的实用程序函数,它通过运行来延迟未来。
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推断出未来返回的类型,这样我就不必自己指定它了。
这个是可能的吗?如果是的话,情况会怎样?
编辑:
为了明确起见,我想要做的是而不是必须使delay成为通用的,并且从delay返回的函数的返回类型可以从它的参数中推断出来。这似乎造成了混乱。
例如:
// declare delay - I don't know what it should look like
final thingThatDelaysAFutureBy3Seconds = delay(Duration(seconds: 3));
// later
final valFromFuture = await thingThatDelaysAFutureBy3Seconds(someFuture);发布于 2020-12-26 18:34:00
我不知道这里的问题是什么,不可能从您提供的函数中推断出类型,因为没有可以用来推断类型的上下文。
另外,您发送的示例代码无效,在运行未来之前也没有等待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);https://stackoverflow.com/questions/65458868
复制相似问题