type Main = Sub1 | Sub2 | Sub3 // NB: the subtypes will have a common `name` field, of the same `string` // type, except Sub3, which has `name` of type AliasedString. type AliasedString = string struct Sub1 { mut: name string } struct Sub2 { mut: name string } struct Sub3 { mut: name AliasedString } fn main() { mut m := []Main{} m << Sub1{ name: 'abc' } m << Sub2{ name: 'def' } m << Sub3{ name: 'xyz' } println(m) assert m[0].name == 'abc' assert m[1].name == 'def' assert m[2].name == 'xyz' }