How do I make the new type system work?

Elixir 1.17 changelog states:

At the moment, Elixir developers will interact with set-theoretic types only through warnings found by the type system

I’ve compiled several old projects with Elixir 1.17 and OTP26 and I’ve found no warnings. I thought that I was doing something wrong and I’ve tried writing checking examples from the doc and still got no errors

$ elixir --version
Erlang/OTP 26 [erts-14.2.5] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]

Elixir 1.17.1 (compiled with Erlang/OTP 26)
$ cat lib/xxx.ex
defmodule Xxx do

  # Performing structural comparisons between non-overlapping types, such as integer >= string

  def one(x) when is_binary(x) do
    if 1 >= x do
      1
    else
      2
    end
  end

  # Performing structural comparisons with structs, such as my_date < ~D[2010-04-17]

  def two(dt = %DateTime{}) do
    if two_compare(dt, DateTime.utc_now()) do
      1
    else
      2
    end
  end

  def two_compare(x, y) do
    x < y
  end

  # Accessing a key on a map or a struct that does not have the given key, such as user.adress

  def three(dt = %MapSet{}) do
    if three_get_field(dt) do
      1
    else
      2
    end
  end

  def three_get_field(x) do
    x.not_present_field
  end
end
$ mix compile --force --warnings-as-errors
Compiling 1 file (.ex)
Generated xxx app

Is there any compiler option I am missing or anything like this? How can I make new type system work?

1 Like

Where you get no warnings it’s not that you’re missing something, but the type system is not yet handling those cases. E.g. your Xxx.one(…) doesn’t cause a warning, but the following does:

x = "abc"
if 1 >= x do
  1
else
  2
end

Elixir 1.17 doesn’t suddently have a feature complete type system in the background, but it only started to integrate what a typesystem can do.