Elixir یک زبان با نوعپذیری پویا است، یعنی بررسی نوع در زمان کامپایل انجام نمیشود. با این حال، مشخصات نوع میتوانند مفید باشند، چون:
میتوان مشخصات نوع را با استفاده از ویژگی ماژول @spec، درست پیش از تعریف تابع، به یک تابع افزود.
@spec longer_than?(String.t(), non_neg_integer()) :: boolean()
def longer_than?(string, length), do: String.length(string) > length
عبارتهای مجاز در مشخصات نوع:
نوعهای پایه، برای مثال:
boolean()integer()، non_neg_integer()، pos_integer()، float()
list()map()any()اجتماع چند نوع:
integer() | list(integer())
نوعهای پارامتردار:
list(integer())، فهرستی از اعداد صحیح%{age: integer()}، یک map با یک مقدار صحیح زیر کلید :age
نوعهای بیرونی (تعریفشده در یک ماژول)، برای مثال:
لیترالها، برای مثال:
%{}، یک map خالی[]، یک فهرست خالی (اما [any()] یک فهرست ناتهی است):ok، یک لیترال اتمنوعهای تخصصی توکار، برای مثال:
char()، یک عدد صحیح در بازهی 0..0x10FFFF
charlist()، یک فهرست از کاراکترهاkeyword()، یک فهرست از تاپلهای دوعنصری که عنصر اولشان یک اتم استنوعهای سفارشی
فهرست کامل همهی نوعها را میتوانید در بخش «Typespecs» در مستندات رسمی پیدا کنید.
آرگومانها در مشخصات نوع را میتوان نامگذاری کرد که برای تشخیص چند آرگومان همنوع مفید است.
@spec to_hex({hue :: integer, saturation :: integer, lightness :: integer}) :: String.t()
میتوان نوعهای سفارشی را با یکی از سه ویژگی ماژول تعریف کرد:
@type، یک نوع عمومی تعریف میکند@typep، یک نوع خصوصی تعریف میکند@opaque، یک نوع عمومی تعریف میکند که ساختارش خصوصی است@type color :: {hue :: integer, saturation :: integer, lightness :: integer}
@spec to_hex(color()) :: String.t()
String.t() در مقابل binary() در مقابل string()
String.t() نوع درست برای رشتههای Elixir است، که باینریهای کدگذاریشده با UTF-8 هستند. از نظر فنی، String.t() بهصورت یک binary() تعریف شده و این دو نوع برای ابزارهای تحلیل معادلاند، اما String.t() انتخاب گویاتری برای مستندسازی توابعی است که با رشتههای Elixir کار میکنند.
از سوی دیگر، string() نوع متفاوتی است. این یک رشتهی Erlang است که در Elixir به آن «charlist» میگویند. باید از نوع string() در مشخصات نوع پرهیز کرد و بهجایش از charlist() استفاده کرد.
Dialyzer یک ابزار تحلیل ایستا است که میتواند مشکلاتی مانند خطاهای نوع را در کد Erlang و Elixir تشخیص دهد. سادهترین راه استفاده از Dialyzer در یک پروژهی Elixir، استفاده از Dialyxir است.