Az Elixir dinamikusan típusos nyelv, ami azt jelenti, hogy nem biztosít fordítási idejű típusellenőrzést. A típusspecifikációk ennek ellenére is hasznosak lehetnek, mert:
Egy típusspecifikációt a @spec modulattribútummal adhatsz meg egy függvényhez, közvetlenül a függvény definíciója előtt.
@spec longer_than?(String.t(), non_neg_integer()) :: boolean()
def longer_than?(string, length), do: String.length(string) > length
A típusspecifikációban engedélyezett kifejezések:
Alaptípusok, például:
boolean()integer(), non_neg_integer(), pos_integer(), float()
list()map()any()Típusok uniója:
integer() | list(integer())
Paraméterezett típusok:
list(integer()) - egész számok listája%{age: integer()} - map egész értékkel a :age kulcs alattTávoli típusok (valamely modulban definiálva), például:
Literálok, például:
%{} - üres map[] - üres lista (de a [any()] nem üres lista):ok - atomliterálBeépített speciális típusok, például:
char() - egész szám a 0..0x10FFFF tartománybólcharlist() - karakterek listájakeyword() - kételemű tuple-ök listája, ahol az első elem egy atomEgyedi típusok
Az összes típus teljes listája a hivatalos dokumentáció „Typespecs” szakaszában található.
A típusspecifikációban az argumentumokat el is nevezheted, ami hasznos, ha több azonos típusú argumentumot akarsz megkülönböztetni.
@spec to_hex({hue :: integer, saturation :: integer, lightness :: integer}) :: String.t()
Az egyedi típusok a három modulattribútum egyikével definiálhatók:
@type - nyilvános típust definiál@typep - privát típust definiál@opaque - nyilvános típust definiál, amelynek a szerkezete privát@type color :: {hue :: integer, saturation :: integer, lightness :: integer}
@spec to_hex(color()) :: String.t()
String.t() vs binary() vs string()
A String.t() a helyes típus az Elixir stringekhez, amelyek UTF-8-kódolású binárisok. Technikailag a String.t() egy binary()-ként van definiálva, és az elemzőeszközök számára ez a két típus egyenértékű, de az Elixir stringekkel dolgozó függvények dokumentálásához a String.t() az, ami jobban kifejezi a szándékot.
A string() viszont egy másik típus. Ez egy Erlang string, amelyet az Elixirben charlistként ismerünk. A string() típust kerülni kell a típusspecifikációkban, helyette a charlist()-et használd.
A Dialyzer egy statikus elemzőeszköz, amely képes felismerni olyan problémákat, mint a típushibák az Erlang- és Elixir-kódban. A Dialyzer használatának legegyszerűbb módja egy Elixir-projektben a Dialyxir.