A type checker for Elixir.
- gradual typing
- type check for protocols and generic protocols
- type check with intersection and union types
- type guards
- type assertion
- type inspection
The package can be installed by adding ex_type
to your list of dependencies in mix.exs
:
def deps do
[
# Required developement dependency
{:ex_type, "~> 0.5.0", only: :dev, runtime: false},
# Optional runtime dependency
{:ex_type_runtime, "~> 0.2.0"}
]
end
To help ExType infer types, following rules are required:
-
All public functions require explicit typespecs.
-
All recursive functions require explicit typespecs.
Basically, you do not need to add a typespec for non-recursive private functions.
# type check for all code
$ mix type
# type check for specified module
$ mix type ExType.Example.Foo
# type check for specified named function
$ mix type ExType.Example.Foo.hello
# type check for named function with specified arity
$ mix type ExType.Example.Foo.hello/0
There are some examples in lib/ex_type/example/
directory.
This project is still in a very early stage with active development. You are likely to hit uncovered cases when playing more complex code beyond the examples. Be free to submit a github issue for a bug report or any feedback.
Plan to apply ExType to following small-sized libraries first:
-
Use
MIX_ENV=test iex -S mix
to access test context. -
It uses serveral Elixir private APIs. It should be ok for now because
ex_type
is a development dependency, not a runtime dependency. Would like to reduce private API usage at later time when the project is more mature.
MIT