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()} خريطة تحمل قيمة عددية تحت المفتاح :age
أنواع بعيدة (معرّفة في وحدة ما)، مثال:
قيم حرفية، مثال:
%{} خريطة فارغة[] مصفوفة فارغة (لكن [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 باسم قائمة المحارف. ينبغي تجنّب النوع string() في مواصفات الأنواع، واستخدام charlist() بدلًا منه.
Dialyzer أداة تحليل ساكن تستطيع كشف مشكلات مثل أخطاء الأنواع في كود Erlang و Elixir. وأسهل أسلوب لاستخدام Dialyzer في مشروع Elixir هو Dialyxir.