Dialyxir 错误 order_by 没有 return Ecto.Query.t
Dialyxir error order_by doesnt return Ecto.Query.t
我有这个方法
@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
代码工作正常,但显然 dialyzer
order_by
没有返回 Ecto.Query.t
因为它抱怨:
The call 'modify_query'... does not have a term of type atom() |
'Elixir.Ecto.Query':t() (with opaque subterms) as 1st argument
如果我注释掉 # |> 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
那么透析器怎么会报错呢??
这里有更多信息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])
我有这个方法
@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
代码工作正常,但显然 dialyzer
order_by
没有返回 Ecto.Query.t
因为它抱怨:
The call 'modify_query'... does not have a term of type atom() | 'Elixir.Ecto.Query':t() (with opaque subterms) as 1st argument
如果我注释掉 # |> 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
那么透析器怎么会报错呢??
这里有更多信息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])