0

我有这个方法

@spec modify_query(Ecto.Query.t) :: Ecto.Query.t
def modify_query(query) do
  # modifies a Ecto.Query.t
end

然后我用一个查询链接该方法:

Item
|> where([active: true])
|> order_by([desc: :start])
|> modify_query

该代码工作正常,但显然 fordialyzer order_by没有返回 aEcto.Query.t因为它抱怨:

调用 'modify_query'... 没有 atom() 类型的术语 | 'Elixir.Ecto.Query':t()(带有不透明子项)作为第一个参数

如果我注释掉# |> order_by([desc: :start])dialyzer不会抱怨

我已经通过 iex 测试了以下输出:

Item
|> where([active: true])
|> order_by([desc: :start])

它说它的数据类型是 Ecto.Query:

Term                                                                         
  #Ecto.Query<from r in Item, where: r.active == true, order_by: [desc: r.start]>
Data type                                                                    
  Ecto.Query

那么透析器怎么会抱怨呢?

4

1 回答 1

1

更多信息在这里https://elixirforum.com/t/dialyxir-error-when-using-ecto-query-t-as-function-argument/7491

基本上, order_by 是一个宏,而 dialyxir 抱怨不透明类型。

我认为它在最新版本的 Ecto 中已修复,但如果您在旧版本的 Ecto 中遇到此问题,您可以通过交换调用来修复它:

Item
|> order_by([desc: :start])
|> where([active: true])
于 2018-03-23T10:02:27.100 回答