输入安全列表转换

时间:2018-12-16 14:27:05

标签: dart

我在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对象的响应来说是安全的,并且易于阅读?

1 个答案:

答案 0 :(得分:0)

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

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值时利用类型系统。