Things are indeed now built on top of typechecker functions. And those functions indeed don't show you that much:
>> any-series?/
== ~#[frame! "any-series?" [value]]~ ; anti
But on the bright side, functions cache their symbols. So you're not completely in the dark about what a typeset represents.
Also: function dispatchers have reflectors now. So you can ask them questions. There's no reason the built-in typecheckers couldn't cook up an answer to TYPES OF...
>> types of any-series?/
== [text! block! ...<whatever>]
So look on the bright side, things aren't that bad.... ![]()
Also... PARAMETER!
Another concept that may come into play here is PARAMETER!.
There's no MAKE for them yet. But we can get one out of the frame of a prebuilt function:
>> negate/
== ~#[frame!! [
number: #[parameter! [any-number? pair! money! time!]]
]]~ ; anti
>> negate.number
== #[parameter! [any-number? pair! money! time!]]
We can use it with match:
>> match frame.number 10
== 10
>> match frame.number <abcd>
== ~null~ ; anti
So that's something like a TYPESET!. It's not a set of bits, but an array of constraints augmented by some optimizations that speed up matching. I'm not sure how much of a role PARAMETER! will play, but it may fulfill some purposes people had in mind for typesets.