This is the intended behavior. The type is called "abstract" for a reason. It hides the underlying type.
By consequence, if you want to expose details about the underlying type, you will have to expose them explicitly.
I think this example should help you understand why:
abstract AVector(Array<Float>) {
public var x(get, never):Float;
public var y(get, never):Float;
public var z(get, never):Float;
public var length(get, never):Float;
public inline function new(x:Float, y:Float, z:Float) this = [x, y, z];
inline function get_x():Float return this[0];
inline function get_y():Float return this[1];
inline function get_z():Float return this[2];
function get_length():Float return Math.sqrt(this[0]*this[0] + this[1]*this[1] + this[2]*this[2])
}
With such an implementation, it is imperative, that the underlying type remains hidden, so that user code doesn't modify it directly (imagine someone called pop on the array for example).
Notice that we define a length here, although the underlying type also has such a property - albeit with a completely different meaning.
Regards,
Juraj