Phoenix Dialyzer变更集警告

时间:2016-04-06 08:08:54

标签: elixir phoenix-framework dialyzer

Dialyzer在以常规方式设置凤凰模型时抱怨它们,即

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

params指示如何更新模型,其中:默认为空,以区分空白表单提交与' 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: 
(#{},#{})

如果我删除了':空'默认参数警告消失。

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

1 个答案:

答案 0 :(得分:1)

由于我不知道您提供的确切类型规格,因此很难建议您应该采取什么措施来解决这个问题。但是,我认为如果您将第二个参数标记为可能是空映射,它应该可以按您的意愿工作。

here。似乎地图并没有得到透析器的特别支持,但似乎有一个相对简单的解决方法。制定规范#{ 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,这对我来说有点难过说。