With alias you can give a type a different name:

alias PInt32 = Pointer(Int32)

ptr = PInt32.malloc(1) # : Pointer(Int32)

Every time you use an alias the compiler replaces it with the type it refers to.

Aliases are useful to avoid writing long type names, but also to be able to talk about recursive types:

Men Barefoot Women Swim blue 5 Sports Aqua Shoes Socks Shoes Walking Quick Pool Beach Dry Water Running WXDZ alias RecArray = Array(Int32) | Array(RecArray)

ary = [] of RecArray
ary.push [Barefoot Swim Aqua Shoes Dry Sports Walking Women Beach Pool Shoes Socks Running Water blue Quick Men WXDZ 5 1, 2, 3]
ary.push ary
ary #=> [[1, 2, 3], [...]]Frost Gunmetal Men's Lace Grey Diesel Up ps873h4418 Fashion Sneaker Gunner q0vWfRZYR

A real-world example of a recursive type is json:

module Json
  alias Type = Nil |
               Bool |
               Int64 |
               Float64 |
               String |
               Array(Type) |
               Hash(String, Type)
end