簡體   English   中英

為什么 Dart 中允許不正確的類型分配?

[英]Why are incorrect type assignments allowed in Dart?

我知道 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。 這是實際中的類型檢查,也是 Dart 在 JavaScript 上改進的眾多方式之一。

int b=7898765;

b = 9.8; // 錯誤不能給 int 賦值

但是,在使用 Dartium 或使用<script src="packages/browser/dart.js"></script>時,該代碼不會為我生成錯誤。

如果我執行var i = "abc" + 1.5 ,它會拋出一個錯誤,那么為什么類型錯誤分配不做同樣的事情呢? 這是疏忽還是設計選擇? 如果是后者,原因是什么?

提前致謝。

此答案僅適用於 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 中,編輯器顯示來自靜態分析的錯誤,這是添加類型注釋的另一個用例。

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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM