跳到主要內容

specify_nonobvious_local_variable_types

實驗性
有修復可用

為區域性變數指定不明顯的型別註解。

詳情

#

當局部變數的型別不明顯時,請為其新增型別註解。

區域性變數上的型別註解可以作為型別推斷的請求,記錄型別推斷步驟的預期結果,並宣告性地允許編譯器和分析器解決在初始化表示式中查詢型別引數和註解以產生所需結果的可能複雜任務。

區域性變數上的型別註解還可以向讀者說明初始化表示式的型別,這將使他們能夠帶著關於給定變數型別的已知良好資訊繼續閱讀後續程式碼行(這可能無法透過檢視初始化表示式立即顯而易見)。

當一個表示式沒有明顯的型別時,它被認為具有不明顯的型別。

在以下情況下,表示式 e 具有明顯的型別:

  • e 是非集合字面量。例如,1, true, 'Hello, $name!'。
  • e 是帶有實際型別引數的集合字面量。例如,<int, bool>{}。
  • e 是列表字面量或集合字面量,其中至少一個元素具有明顯的型別,並且所有元素都具有相同的型別。例如,[1, 2] 和 { [true, false], [] },但不包括 [1, 1.5]。
  • e 是對映字面量,其中所有鍵值對的鍵都具有明顯的型別,值也具有明顯的型別,並且所有鍵具有相同的型別,所有值也具有相同的型別。例如,{ #a[] },但不包括 {1: 1, 2: true}。
  • e 是一個例項建立表示式,其類部分不是原始的。例如,如果 C 是非泛型類,則為 C(14),或者如果 C 接受一個型別引數,則為 C(14),但如果 C 接受一個或多個型別引數,則不是 C(14)。
  • e 是一個級聯表示式,其目標具有明顯的型別。例如,1..isEven..isEven 具有明顯的型別,因為 1 具有明顯的型別。
  • e 是型別轉換。例如,myComplexExpression as int。

dart
List<List<Ingredient>> possibleDesserts(Set<Ingredient> pantry) {
  var desserts = genericFunctionDeclaredFarAway(<num>[42], 'Something');
  for (final recipe in cookbook) {
    if (pantry.containsAll(recipe)) {
      desserts.add(recipe);
    }
  }

  return desserts;
}

const List<List<Ingredient>> cookbook = ...;

dart
List<List<Ingredient>> possibleDesserts(Set<Ingredient> pantry) {
  List<List<Ingredient>> desserts = genericFunctionDeclaredFarAway(
    <num>[42],
    'Something',
  );
  for (final List<Ingredient> recipe in cookbook) {
    if (pantry.containsAll(recipe)) {
      desserts.add(recipe);
    }
  }

  return desserts;
}

const List<List<Ingredient>> cookbook = ...;

此規則處於實驗階段。它正在評估中,可能會更改或移除。歡迎提供關於其行為的反饋!主要問題連結在此:https://github.com/dart-lang/sdk/issues/58773。

不相容的規則

#

specify_nonobvious_local_variable_types 規則與以下規則不相容:

啟用

#

要啟用 specify_nonobvious_local_variable_types 規則,請在你的 analysis_options.yaml 檔案中的 linter > rules 下新增 specify_nonobvious_local_variable_types

analysis_options.yaml
yaml
linter:
  rules:
    - specify_nonobvious_local_variable_types

如果你正在使用 YAML map 語法來配置 linter 規則,請在 linter > rules 下新增 specify_nonobvious_local_variable_types: true

analysis_options.yaml
yaml
linter:
  rules:
    specify_nonobvious_local_variable_types: true