我有以下代码:
defmodule Foo do
@moduledoc false
use Ecto.Schema
import Ecto.Changeset
@type t :: %__MODULE__{
id: integer(),
foo: String.t(),
baz_id: String.t(),
bar: String.t() | nil
}
embedded_schema do
field :foo, :string
field :bar, :string
end
@spec changeset(t() | Ecto.Changeset.t(), map()) :: Ecto.Changeset.t()
def changeset(bae \\ %__MODULE__{}, attrs) do
bae
|> cast(attrs, @fields)
|> unique_constraint(:baz_id)
end
end
foo
根据定义,baz_id
不应该是。但是,正在抱怨(使用给定的),因为默认值会将它们设置为.nil
@type
dialyzer
@spec
%__MODULE__{}
nil
如果我将@type
定义替换为:
...
@type t :: %__MODULE__{
id: integer() | nil,
foo: String.t() | nil,
baz_id: String.t() | nil,
bar: String.t() | nil
}
...
那么dialyzer
不会抱怨,但我不再认为某些字段不可为空。
什么是一种优雅的方式来使changeset()
工作以目前的方式工作,并避免dialyzer
抱怨这种特定的用途?