3

我知道 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

本教程中,我发现它说:

但是下面的代码片段会产生一个错误,因为编译器将 b 识别为一个 int ,它被错误地分配了一个 double 值。这是实际的类型检查,也是 Dart 在 JavaScript 上改进的众多方法之一。

诠释 b=7898765;

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

但是,在使用 Dartium 或使用<script src="packages/browser/dart.js"></script>.

如果我这样做var i = "abc" + 1.5了,它会抛出一个错误,那么为什么类型错误分配不做同样的事情呢?这是疏忽还是设计选择?如果是后者,原因是什么?

提前致谢。

4

2 回答 2

2

此答案仅适用于 Dart 1.x

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

var i = "abc" + 1.5

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

对于从 Dart 生成的 JS,您可以$dart2js通过添加来配置转换器以生成“检查模式”输出

transformers:
- $dart2js:
    checked: true

到您的pubspec.yaml文件中(有关更多$dart2js选项,请参阅为 Pub 配置内置 dart2js 转换器)。这仅在您使用pub build. 如果您dart2js直接使用生成 JS 传递-c标志以创建检查模式输出。

对于在服务器 VM 上运行的代码,还可以传递-c类似的标志

dart -c your_script.dart

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

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

于 2015-10-29T20:47:12.387 回答
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 反序列化模式

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'
于 2019-12-11T05:27:06.923 回答