【问题标题】:Type inference in dart curried functiondart curried 函数中的类型推断
【发布时间】:2020-12-26 17:22:26
【问题描述】:

我知道 Typescript 的类型系统允许进行一些非常复杂的推断,我想知道我能将 dart 推到多远。

我想创建一个简单的实用函数,通过柯里化来延迟 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);

理想情况下,我希望 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);

【问题讨论】:

    标签: dart type-inference


    【解决方案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);
    

    【讨论】:

    • 意图是正确的,我想在返回值之前至少等待duration
    • 我想要做的就是将任何类型的未来传递给柯里化函数,并从传递给它的参数中推断出返回类型。
    • 如果你的函数变量类型推断正确,请查看更新后的代码
    猜你喜欢
    • 2016-03-13
    • 1970-01-01
    • 2022-04-11
    • 2021-03-09
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    相关资源
    最近更新 更多