specify_nonobvious_local_variable_types
为非显而易见的局部变量指定类型注解。
详情
#当类型非显而易见时,对初始化的局部变量进行类型注解。
局部变量的类型注解可以作为类型推断的请求,记录类型推断步骤的预期结果,并声明式地允许编译器和分析器解决可能复杂的任务,即在初始化表达式中查找产生期望结果的类型参数和注解。
局部变量的类型注解也可以告知读者初始化表达式的类型,这将使他们能够继续阅读后续代码行,并了解给定变量的已知良好信息(这可能无法通过查看初始化表达式立即显现)。
当一个表达式不具有显而易见的类型时,它被认为具有非显而易见的类型。
在以下情况下,表达式 e 具有显而易见的类型
- e 是非集合字面量。例如,1、true、'Hello, $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。
错误
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 = ...;
正确
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
linter:
rules:
- specify_nonobvious_local_variable_types
如果您改为使用 YAML 映射语法来配置 linter 规则,请在 linter > rules 下添加 specify_nonobvious_local_variable_types: true
linter:
rules:
specify_nonobvious_local_variable_types: true
除非另有说明,否则本网站上的文档反映的是 Dart 3.7.1 版本。页面上次更新于 2025-03-07。 查看源代码 或报告问题。