The type you name after satisfies adds nothing to the value's type
The common read: satisfies X checks the value against X, so whatever X declares, readonly included, is what the value's type then carries
The compiler checks the expression against the type after satisfies, and the expression's type does not change when the check passes.
The operator does only that: no modifier, no optionality, no union member, no index signature and no alias name crosses from the right-hand side to the binding, which is why satisfies Readonly<T> makes nothing read-only, satisfies Partial<T> makes nothing optional, and satisfies SomeAlias never makes the editor show you SomeAlias on hover. The constraint checks the value and does not change its type.
For example, a shared settings object is declared against a Readonly constraint, the first request that uses it changes it, and the on-call engineer treats the result as cache poisoning because the second request read a value the first request wrote and nothing in the module shows which code wrote it. To make the value read-only, use as const. A Readonly constraint does not freeze the value.

