内容

指定_不明显_局部_变量_类型

为局部变量指定不明显的类型注解。

此规则当前为**实验性**规则,尚未在稳定版 SDK 中提供。

此规则提供了一个快速修复

不兼容规则:omit_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/linter/issues/3480。

用法

#

要启用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