我应该如何将映射子类型传递给函数?

问题描述 投票:0回答:1
  void foo() {
    final fooMap = {
      'one': true,
    };
    bar(fooMap);
  }

  void bar(Map<String, Object> barMap) {
    barMap['two'] = 'Hello World';
  }

在上面的代码中,我收到错误:

DartError: TypeError: "Hello World": type 'String' is not a subtype of type 'bool'

据我了解,这是因为

Map<String, bool>
不是
Map<String, Object>
的子类型。如果我的理解是正确的,我不知道为什么我的 IDE 不告诉我不要这样做。

foo()
中,如果我将
final fooMap...
更改为
Map<String, Object> fooMap...
,那么一切都会正常工作。但同样,我觉得 IDE 应该捕获它,让我知道这一点。

bar()
中,如果我将地图复制到新的
Map<String, Object>
中,它也可以工作。

我的问题是,我该如何处理?这里有强类型选项吗?我更喜欢在编译时捕获这样的事情,而不是运行时。

dart dictionary casting
1个回答
0
投票

Dart 的类型推断能力强;

Map
的类型将通过其条目推断出来。

final map = {
  'one': true,
};

相同
final Map<String, bool> map = {
  'one': true,
};

您不会收到

bar
函数的编译错误,因为从技术上讲,地图的
Map<String, bool>
类型会使用参数的
Map<String, Object>
类型进行编译。

在 Dart 中,因为 一切都是

Object
类型(除了
null

final one = true;
print(one is Object); // true

如果您想在地图上允许

dynamic
值,您可以采用几种不同的方式。

  1. (推荐)向地图提供类型参数
final map = <String, dynamic>{
  'one': true,
};
  1. 添加与第一个条目类型不同的第二个条目
final map = {
  'one': true,
  'two': 'hello world',
};

警告: 这种方式仅在您提供不同类型的多个

value
时才有效。

如果您提供相同类型的多个条目,地图的推断类型不会改变

// type: Map<String, bool>
final map = {
  'one': true,
  'two': false,
};
© www.soinside.com 2019 - 2024. All rights reserved.