跳到主要内容

specify_nonobvious_property_types

实验性的
修复可用

为顶层和静态变量指定非显而易见的类型注解。

详情

#

当类型非显而易见时,请为已初始化的顶层或静态变量添加类型注解。

顶层或静态变量的类型注解可以作为类型推断的请求,记录类型推断步骤的预期结果,并声明式地允许编译器和分析器解决在初始化表达式中查找产生期望结果的类型参数和注解的可能复杂的任务。

顶层或静态变量的类型注解还可以告知读者初始化表达式的类型,这将使他们能够继续阅读代码中变量被使用的位置,并了解关于给定变量类型的已知良好信息(这可能无法通过查看初始化表达式立即显而易见)。

当表达式不具有显而易见的类型时,则认为该表达式具有非显而易见的类型。

在以下情况下,表达式 e 具有显而易见的类型

  • e 是非集合字面量。 例如,1、true、'你好, $name!'。
  • e 是带有实际类型参数的集合字面量。 例如,<int, bool>{}。
  • e 是列表字面量或 Set 字面量,其中至少一个元素具有显而易见的类型,并且所有元素都具有相同的类型。 例如,[1, 2] 和 { [true, false], [] },但不包括 [1, 1.5]。
  • e 是 Map 字面量,其中所有键值对都具有显而易见的类型的键和显而易见的类型的值,并且所有键都具有相同的类型,并且所有值都具有相同的类型。 例如,{ #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 映射语法来配置 linter 规则,请在 linter > rules 下添加 specify_nonobvious_property_types: true

analysis_options.yaml
yaml
linter:
  rules:
    specify_nonobvious_property_types: true