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.