A type annotation checks a value and replaces its inferred type; satisfies in 4.9 checks it and keeps the narrow one.
type Config = Record<string, string | number>
// annotated: values are string | number, so .toUpperCase()
// is an error even on one you can see is a string
const a: Config = { host: 'localhost', port: 8090 }
a.host.toUpperCase() // Error
// satisfies: checked against Config, inferred narrowly
const b = { host: 'localhost', port: 8090 } satisfies Config
b.host.toUpperCase() // fine
b.port.toFixed() // fine
This removes the constant tension between validating a literal against a type and keeping the literal types for everything downstream, which previously needed a helper function with a generic. It is most valuable on configuration objects, route maps and anything where the keys matter — a satisfies Record<string, Handler> checks the shape and still gives autocomplete on the key names.