为什么Dart中允许不正确的类型分配?

时间:2015-10-29 20:40:40

标签: dart dartium

我知道Dart几乎可以选择类型,但如果我选择指定变量类型,我希望像int i = "abc"之类的赋值在运行时抛出错误。但是,无论是否以及以下任何内容都抛出错误,他们只是忽略类型转换。

  String str     = "test";
  int integer    = 5;
  double decimal = 1.5;
  List list      = [1,2,3];

  String s = decimal;   print(s);  // 1.5
  int i    = str;       print(i);  // test
  double d = list;      print(d);  // [1, 2, 3]
  List l   = integer;   print(l);  // 5

我在this tutorial找到了,它说:

  

但下面的代码片段会生成错误,因为编译器会将b标识为错误地被赋予double值的int。这是类型检查的实际应用,也是Dart改进JavaScript的众多方法之一。

     

int b = 7898765;

     

b = 9.8; // ERROR不能将double分配给int

但是,使用Dartium或使用<script src="packages/browser/dart.js"></script>时,该代码不会为我生成错误。

如果我var i = "abc" + 1.5,它会引发错误,那么为什么类型错误分配不会这样做呢?这是疏忽还是设计选择?如果是后者,那么推理是什么?

提前致谢。

2 个答案:

答案 0 :(得分:3)

在Dart类型中,在生产模式下运行时会忽略注释(默认)。如果在已检查模式下运行,则会检查类型。如果在实例上调用不存在的方法,则仍会抛出异常。

var i = "abc" + 1.5

+运算符(方法)显然会对参数进行类型检查并抛出,因为它不是非字符串值。

对于从Dart生成的JS,您可以配置$dart2js转换器以生成&#34;检查模式&#34;通过添加

输出
transformers:
- $dart2js:
    checked: true

到您的pubspec.yaml文件(有关更多$dart2js个选项,请参阅Configuring the Built-in dart2js Transformer for Pub)。 这仅在使用pub build构建时生效。如果直接使用dart2js生成JS,则传递-c标志以创建检查模式输出。

对于在服务器上运行的代码,VM也会传递-c标志,如

dart -c your_script.dart

在您的问题中,您没有提供有关如何运行Dart脚本或如何生成JS的任何信息。

在这个简单的DartPad中,编辑器显示静态分析中的错误,这是添加类型注释的另一个用例。

答案 1 :(得分:0)

Dart 2.6拒绝此代码。

A value of type 'double' can't be assigned to a variable of type 'String'

https://dartpad.dev/10ebe4bb74a11fe6e68efb351af40d1a

我还测试了Map<String, dynamic>(以便更好地了解JSON deserialization pattern

void main() {
  Map<String, dynamic> map = {
    'str': 'test',
    'integer': 5,
    'decimal': 1.5,
    'list': [1,2,3]
  };

  String s = map['decimal'];   print(s);  // JSDouble not String
  int i    = map['str'];       print(i);  // JSString not int
  double d = map['list'];      print(d);  // JSArray not double
  List l   = map['integer'];   print(l);  // JSInt not List
}

https://dartpad.dev/7bc355b3b7779d2b37e1aae2b6def050

,并且在运行时也会失败,并显示诸如

的错误
TypeError: 1.5: type 'JSDouble' is not a subtype of type 'String'