Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

gyson/ex_type

A type checker for Elixir

gyson/ex_type.json
{
"createdAt": "2019-02-24T15:41:41Z",
"defaultBranch": "master",
"description": "A type checker for Elixir",
"fullName": "gyson/ex_type",
"homepage": "",
"language": "Elixir",
"name": "ex_type",
"pushedAt": "2023-03-24T12:53:16Z",
"stargazersCount": 34,
"topics": [
"checker",
"elixir",
"gradual-typing",
"type"
],
"updatedAt": "2025-08-27T12:19:23Z",
"url": "https://github.com/gyson/ex_type"
}

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:

  1. All public functions require explicit typespecs.

  2. All recursive functions require explicit typespecs.

Basically, you do not need to add a typespec for non-recursive private functions.

Terminal window
# 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