gpt4 book ai didi

typescript - 在 Dart 中使用具有类型安全性的对象上的扩展运算符

转载 作者:行者123 更新时间:2023-12-03 02:52:31 25 4
gpt4 key购买 nike

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

失败的方法 1:使用类

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
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'.

最佳答案

您可以使用第一种方法实现它,但是代码片段有两个问题:

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

第二个问题,Foo b = { ...a };上的编译错误是因为 Dart 使用 {}对于集合和映射,因此您必须通过在 <> 中添加一个或两个类型参数来指定类型。 .

检查这个例子:

  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 = <Foo>{...b}; 中只使用了 1 个参数dart 知道我们想要一个集合。

更新:

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

另一方面,正如您提到的,第二种方法“不会给您”类型安全,因为您使用的是动态的。并且仅编译因为您声明 Map<String, dynamic> a = { 'aNumber': 2, 'aString': 'lorem' }; ,这是一个 map 并实现了 Iterable(你可以使用 ...a)。

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

希望能帮助到你!

关于typescript - 在 Dart 中使用具有类型安全性的对象上的扩展运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61065524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com