satisfies checks a value without widening its type

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.