【问题标题】:Use Spread Operator on Object with Type Safety in Dart在 Dart 中对具有类型安全性的对象使用扩展运算符
【发布时间】:2020-07-18 18:56:20
【问题描述】:

我想在具有类型安全性的键值数据上使用展开运算符 (...)。在 TypeScript 中,我会使用 Interfaces 来实现这一点,但我无法在 dart 中找到一种方法。

方法一失败:使用类

class Foo {
  int aNumber;
  String aString;
}

Foo a = Foo();
Foo b = { ...a, 'aString': 'ipsum' }; // This literal must be either a map or a set.

失败的方法2:使用地图

Map<String, dynamic> a = { 'aNumber': 2, 'aString': 'lorem' };
Map<String, dynamic> b = { ...a, 'aString': 'ipsum' }; // No error, but also no type safety.

注意:在这些方法中,b 不应该是一个列表。

我需要的 TypeScript 示例

interface Foo {
  aNumber: number;
  aString: string;
}
const a: Foo = { aNumber: 2, aString: 'lorem' };
const b: Foo = { ...a, aString: 'ipsum' }; // Has all the props of 'a' and overrides 'aString' to 'ipsum'.

【问题讨论】:

  • 没有类型安全是什么意思?在地图方法中,它们都具有相同的类型,不是吗?如果您尝试执行以下操作:Map&lt;String, String&gt; a = { 'aNumber': "test", 'aString': 'lorem' }; Map&lt;String, int&gt; b = { ...a }; 这将在编译时失败。
  • @StefanoSaitta 感谢您的回复。地图方法:具有“动态”类型的任何条目的列表。我需要:一个包含条目“int aNumber”和“String aString”的对象。

标签: typescript flutter dart rxdart


【解决方案1】:

第一种方法可以实现,但是sn-p有两个问题:

首先检查扩展运算符是否在可迭代中实现,因此Foo a = Foo(); 行应替换为一些可迭代,例如列表。

第二个问题,Foo b = { ...a };上的编译错误是因为Dart对set和map都使用{},所以必须通过在&lt;&gt;中添加一个或两个类型参数来指定类型。

检查这个例子:

  var a = <Foo>[];
  var b = <String>[];  
  var c = <Foo>{...a}; // works, a is Foo list
  var d = <Foo>{...b}; // compile time error, 'String' can't be assigned to the set type 'Foo'.

由于我们在var d = &lt;Foo&gt;{...b}; 中只使用了一个参数,dart 知道我们需要一个集合。

更新:

在这种情况下,您不能使用扩展运算符。引入了扩展运算符以简化集合的工作,并且集合具有泛型参数给定的类型。所以如果你的类没有实现 Iterable 你不能在给定的实例上调用 ...。你会得到一个编译时错误:

Spread elements in list or set literals must implement 'Iterable'

另一方面,正如您提到的第二种方法“不给您”类型安全性,因为您使用的是动态的。而且也只能编译因为你声明了Map&lt;String, dynamic&gt; a = { 'aNumber': 2, 'aString': 'lorem' };,它是一个映射并实现了Iterable(你可以使用...a)。

对于您当前的问题,您需要找到不同的解决方案,也许是 Foo 类上的自定义函数,它返回一个 Map 并处理类型,然后在该映射上使用扩展运算符。

希望对你有帮助!

【讨论】:

  • 感谢您的快速回复。如果我正确理解了您的示例,则您正在创建一个“Foo”列表并使用扩展运算符。但是,我想对 Foo 的成员使用扩展运算符(请参阅更新的代码)。
  • 谢谢,这对我帮助很大。我会重新思考我的架构。
猜你喜欢
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 2023-02-25
  • 2017-02-23
  • 2021-04-09
相关资源
最近更新 更多