TypeScript 5.0, and decorators that are the standard ones

The March release implements the stage 3 proposal, which is a different feature from the flag that has been in the language since 2015.

// the new signature — a context object, not a property descriptor
function logged<This, Args extends any[], Return>(
  target: (this: This, ...args: Args) => Return,
  context: ClassMethodDecoratorContext<This>,
) {
  return function (this: This, ...args: Args): Return {
    console.log(`entering ${String(context.name)}`)
    return target.call(this, ...args)
  }
}

The two cannot be mixed: experimentalDecorators keeps the old behaviour, and turning it off switches every decorator in the project at once. The missing piece is metadata — emitDecoratorMetadata has no equivalent, so anything doing dependency injection from parameter types stays on the legacy flag until its library catches up.