Расширения

Расширения (extensions) могут использоваться для расширения или определения анонимного типа, либо для расширения типа "на лету".

Вот пример расширения определения анонимного типа:

typedef Point = {
   var x : Int;
   var y : Int;
}

// определяем 'p' как Point с дополнительным полем z
var p : {> Point, z : Int }
p = { x : 0, y : 0, z : 0 }; // работает
p = { x : 0, y : 0 }; // не работает
</div>

Для классов, поскольку они не определяют типов, необходимо приводить тип (cast) во время присвоения. Это небезопасно, так что будьте осторожны.

   var p : {> flash.MovieClip, tf : flash.TextField };
   p = flash.Lib._root; // ошибка
   p = cast flash.Lib._root; // работает, но без контроля типов !
</div>

Расширения можно также использовать для создания каскадных определений типов:

typedef Point = {
    var x : Int;
    var y : Int;
}
typedef Point3D = {> Point,
    var z : Int;
}
</div>

В этом случае, каждый Point3D будет также и Point.

Каскадные определения типов могут быть также созданы из типов обычных классов, но компилятор не сможет сравнить этот typedef с анонимным объектом или другим инстансом класса. Это происходит потому, что Haxe не является полностью структурно подтипизированным (structurally subtyped). Структурная подтипизация может использоваться только между анонимными определениями типа или между инстансом класса и анонимным определением типа.