跳到主內容

specify_nonobvious_property_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
final myTopLevelVariable =
    genericFunctionWrittenByOtherFolks(with, args);

class A {
  static var myStaticVariable =
      myTopLevelVariable.update('foo', null);
}

正例

dart
final Map<String, Widget?> myTopLevelVariable =
    genericFunctionWrittenByOtherFolks(with, args);

class A {
  static Map<String, Widget?> myStaticVariable =
      myTopLevelVariable.update('foo', null);
}

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

啟用

#

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

analysis_options.yaml
yaml
linter:
  rules:
    - specify_nonobvious_property_types

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

analysis_options.yaml
yaml
linter:
  rules:
    specify_nonobvious_property_types: true