Struct instance that behaves as an array as well

For sol::ODESolution from DifferentialEquations.jl, it can be called as

sol[1:2, 2:3]

in addition to having properties to call and utilize.

How does one design a struct whose instances behave as such?

To support indexing, a struct needs to implement an appropriate getindex method: sol[1:2, 2:3] is equivalent to getindex(sol, 1:2, 2:3). An example is given here in the documentation.

The ODESolution type implements more than just Base.getindex. Since it is an actual AbstractArray subtype, it also has a size etc. The methods required for an AbstractArray are also listed on the documentation page linked above.