6.2.2 Implementing Dynamic

Extern classes can implement Dynamic and Dynamic<T> which enables arbitrary field access. In the former case, fields can have any type, in the latter, they are constrained to be compatible with the parameter type:

extern class ImplementsDynamic implements Dynamic<String> {
  public var present:Int;
  public function new();
}

class Main {
  static public function main() {
    var c = new ImplementsDynamic();
    // valid, present is an existing field
    c.present = 1;
    // valid, assigned value is a String
    c.stringField = "foo";
    // error, Int should be String
    //c.intField = 1;
  }
}

Implementing Dynamic does not satisfy the requirements of other implemented interfaces. The expected fields still have to be implemented explicitly.

Trivia: Implementing Dynamic on non-externs

Starting with Haxe 4, implementing Dynamic is only allowed on extern classes. In previous versions any class could implement Dynamic, allowing arbitrary fields to be read or written. Additionally a special resolve method could be used to resolve read access to a non-existend field. A similar feature is now available as field access operator overload on abstracts.