TypeScript 4.9 added the satisfies operator. const config = {...} satisfies Config validates that the object matches Config while keeping the precise literal types of each property, where const config: Config = {...} would widen them to the annotated type.
The practical difference shows in lookups. With an annotation of Record<string, string | string[]>, reading a property gives the union and forces a narrowing check at every use. With satisfies, the same object still checks against the constraint but config.palette keeps its exact literal type, so no narrowing is needed and excess property checking still catches typos.
It also catches the opposite mistake. An annotation lets a missing optional property slide silently; satisfies reports it against the constraint at the definition site. Use satisfies for configuration objects, route tables, and const maps whose exact keys matter downstream, and keep plain annotations for function parameters and public API surfaces where widening is the point.