I mentioned elsewhere that Sorbet (an implementation) allows inline type definitions. Its syntax for local variables is this:
def foo
username = T.let("heavenlyblue", String)
end
It's a little clunky but gets the job done, and in practice it's quite rare that you need to type a local variable.
However, more important to have in the body of a program is tools for casting and asserting types, like these:
T.assert_type(foo, String)
T.cast(foo, String)
T.must(foo) # assures the compiler foo is not nil
T.unsafe(foo) # the equivalent of a TS `any` cast
Docs at
https://sorbet.org/docs/type-assertionsI'm not sure how tools that use RBS without inline syntax will handle these situations, but to be honest I expect the community to adopt Sorbet in practice anyway. It's very fast and battle-hardened in production at Stripe and several other large companies.
Disclaimer, again: former Stripe employee.