Phoenix Dialyzer转换器警告



Dialyzer抱怨Phoenix型号在以常规方式设置时,即

def changeset(model, params \ :empty)
...

params指示如何更新模型,默认值为:empty,以区分"params"等于空映射的空白表单提交。

Dialyzer警告:

The call 'Elixir.Backend.Plot':
changeset(x0@1::any(),'empty') will never return since it differs in the 2nd argument from the success typing arguments: 
(#{},#{})

如果删除":empty"默认参数,则警告将消失。

是否有一个规范可以满足类型检查器的要求,同时保留通常的默认变更集功能?有什么提示或指示吗?

由于我不知道您提供的确切类型规范,因此很难建议您应该如何处理此问题。然而,我认为如果您将第二个参数标记为可能是一个空映射,那么它应该按您的意愿工作。

看这里。透析器似乎不特别支持映射,但似乎有一个相对简单的解决方法。将规范设为#{ any() => any() }。但是,正如该消息中所提到的,尚不完全清楚这是否适用于空映射。


编辑:

我的回答似乎有点不清楚。当我说"spec"时,我指的是你在函数上方添加的注释,告诉透析器你期望你的函数如何表现。例如:

  @spec get_short_name(Path.t)::Path.t
  def get_short_name(path) when is_binary(path) do

如果你根本没有指定任何@spec,那么这可能是你的问题。

在你上面指定的情况下,我建议这样的东西可能会起作用:

@spec changeset(#{any() => any()}, #{any() => any()})::returntype
def changeset(model, params \ :empty)

你想把returntype修改为变更集返回的任何类型,我无法从你发布的片段中判断出模型的类型应该是什么,所以我猜这是一个映射。正如我所说,由于我不知道你对变更集做了什么的细节,而且你似乎没有指定@spec,所以我很难说。

相关内容

  • 没有找到相关文章

最新更新