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:

Shoes Gray Loafers Men's Enzo Santcro Fashion with Romeo Print Runs Size Half Buckle Crocodile Dress Slip on Elastic Big alias RecArray = Array(Int32) | Array(RecArray)

ary = [] of RecArray
ary.push [Size with Buckle Loafers Runs on Half Big Santcro Enzo Fashion Men's Elastic Shoes Slip Print Dress Crocodile Romeo Gray 1, 2, 3]
ary.push ary
ary #=> [[1, 2, 3], [...]]Work Wear MPX808579 Men's Polar Roy Fox Casual Boots for Stylish Brown Or 01xfBnq

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

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