FooBar = Struct.new(:foo, :bar) class FooBar def my_foo foo end end def gen_foobar FooBar.new(1) end foobar = gen_foobar foobar.foo = "str" foobar.bar = :sym __END__ # Classes class Object private def gen_foobar: -> FooBar end class FooBar < Struct[untyped] attr_accessor foo(): Integer | String attr_accessor bar(): :sym? def my_foo: -> (Integer | String) end