跳到主要內容

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 映射語法來配置 linter 規則,請在 linter > rules 下新增 specify_nonobvious_local_variable_types: true

analysis_options.yaml
yaml
linter:
  rules:
    specify_nonobvious_local_variable_types: true