1

当以通常的方式设置时,Dialyzer 会抱怨 Phoenix 模型,即

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

params 指示如何更新模型,默认情况下使用 :empty 来区分空白表单提交与 'params' 等于空映射。

透析器警告:

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' 默认参数,警告就会消失。

是否有满足类型检查器的规范,同时保持通常的默认变更集功能?任何提示或指示?

4

1 回答 1

1

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

这里。似乎透析器没有特别支持地图,但似乎有一个相对简单的解决方法。制定规范#{ any() => any() }但是,正如该消息中提到的,尚不清楚这是否适用于空地图。


编辑:

看来我的回答有点不清楚。当我说“规范”时,我的意思是您在函数上方添加的注释,以告诉透析器您期望函数的行为方式。例如:

  @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,所以我很难说。

于 2016-04-06T12:53:16.967 回答