I was checking the documentation for elixir and erlang types for ways to represent a map in the typespec.
I have seen different projects defining types for maps this way:
@type user :: %{
required(:first_name) => binary(),
optional(:last_name) => binary()
}
And this would be a valid “user” map that follows the typespec:
%{first_name: "John", last_name: "Doe"}
I could not find in the docs whats the proper way to represent a map with string keys. I tried to create a similar type from above using string keys instead of atom keys:
@type user :: %{
required("first_name") => binary(),
optional("last_name") => binary()
}
but this doesn’t compile, which is kinda expected considering the documentation is clear that it should follow the given format:
| %{} # empty map
| %{key: value_type} # map with required key :key of value_type
| %{key_type => value_type} # map with required pairs of key_type and value_type
| %{required(key_type) => value_type} # map with required pairs of key_type and value_type
| %{optional(key_type) => value_type} # map with optional pairs of key_type and value_type
But feels like the language could offer some support for this type:
%{"key" => value_type} # map with required key "key" of value_type
So maps with string keys have better representation when defining the @type instead of fallback to map() or %{binary() => term()}.






















