This behaviour is expected, but there are multiple ways to get what you want. One way is
struct C{S,T}
s::S
i::T
end
I like this design if S is an empty “trait type” e.g. sizeof(S) = 0. It has the advantage, that you can do things like @set c.s = S2().
If that is not an option, overload ConstructionBase.constructorof or ConstructionBase.setproperties for more complicated cases.