【问题标题】:Type safe list transformations类型安全列表转换
【发布时间】:2018-12-16 23:36:47
【问题描述】:

我在 Dart 中使用列表转换玩得很开心。由于我的大部分经验是使用 Typescript,我将在 TS 中提供一个工作示例,然后在 Dart 中提供我的解决方案。

从响应到创建 Coin 对象的类型安全的打字稿。

type Entry = {
  spark: Record<string, Spark>;
};

type Spark = {
  t: number;
  p: number;
};

const coin = (entry: Entry): Coin => ({
  sparkline: Object.values(entry.spark)
    .sort((a, b) => a.t - b.t)
    .map(spark => spark.p)
});

type Coin = {
  sparkline: number[];
};

Dart 具有脆弱类型、令人困惑的字符串转换,并且无法告诉编译器此映射中的内容。

  Coin.fromEntry(MapEntry<String, Map> e)
      : this.sparkline = List<num>.from((List<Map>.from(e.value['spark'].values)
              ..sort((a, b) => a['t'].compareTo(b['t'])))
            .map((spark) => spark['p'].toDouble())
            .toList());

有没有一种方法可以进行类型安全的列表转换,而不是响应更易于阅读的 Coin 对象?

【问题讨论】:

  • e.value['spark'].values ..sort((a, b) =&gt; a['t'].compareTo(b['t']))) .map((spark) =&gt; spark['p'].toDouble()) .toList()); 或者 (e.value['spark'].values as List&lt;String&gt;) ..sort((a, b) =&gt; a['t'].compareTo(b['t']))) .map((spark) =&gt; spark['p'].toDouble()) .toList()); 有什么问题?

标签: dart


【解决方案1】:

这是翻译打字稿代码的另一种方法。

class Entry {
  Map<String, Spark> spark;
}

class Spark {
  int t;
  double p;
}

class Coin {
  List<double> sparkline;

  Coin.fromEntry(Entry entry)
      : sparkline = (entry.spark.values.toList()
              ..sort((a, b) => a.t.compareTo(b.t)))
            .map((spark) => spark.p)
            .toList() {}
}

如果 Spark 作为 JSON 对象/字典进入您的程序,我建议创建一个单独的反序列化方法。这样,您就可以在对 Spark 值进行操作时利用类型系统,而不是到处使用动态值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    相关资源
    最近更新 更多