为什么 dart 分析器无法识别类型错误?

时间:2021-03-13 22:28:54

标签: dart

代码如下:

static const _defaults = <String, dynamic>{
  'api_key': '4839234792374',
  'enabled': false,
  'concurrency': 4,
};

String getString(String key) {
  return _remoteConfig == null ?
    _defaults.containsKey(key) && _defaults[key] :
    _remoteConfig.getString(key);
}

这个错误很明显(我很惭愧,是由类似 getBool(key) 函数的盲目复制粘贴产生的。如果 _remoteConfignull,执行会命中 {{1 }} 路径,我得到运行时异常 bool && String。完全合法,但为什么分析器没有看到它?执行流程非常清晰,一条路径返回 type 'String' is not a subtype of type 'bool' 另一条路径(理论上)返回 {{1 }} 并且返回类型是String,这意味着所有路径都返回dynamic。 我不明白什么?

飞镖 2.12.0 迂腐1.11.0

分析器选项:

String

1 个答案:

答案 0 :(得分:1)

我认为您在问两个问题:

  1. 为什么分析器不抱怨 _defaults.containsKey(key) && _defaults[key]

  2. 为什么分析器不抱怨沿其两条路径具有不同类型的三元表达式?

对于 #1:由于 _defaults[key] 返回类型 dynamic(在运行时可能是 bool),我不希望分析投诉。

对于#2:由于两条路径具有不同的类型,三元表达式的类型是公共基类型Object。如果启用了隐式转换,则 Object 将自动转换为 String 返回类型。

如果您在 analysis_options.yaml 配置文件中disable implicit casts,分析器确实会捕获这两个错误:

analyzer:
  strong-mode:
    implicit-casts: false

运行分析器然后打印:

<块引用>

错误 • 运算符 '&&' 的操作数必须可分配给 'bool' at ... • (non_bool_operand)

<块引用>

错误 • 无法从函数“getString”返回“Object”类型的值,因为它在...处具有“String”的返回类型 • (return_of_invalid_type)

(我很惊讶 implicit-casts: false 会触发带有 && 操作数的 dynamic 表达式的分析错误;也许我的理解不是很准确,或者这是一个错误在分析器中。)