Изменения в новых версиях / TypeScript 5.0

// *** before: ***
//экспериментальные декораторы (experimentalDecorators: true) - не стандарт
//TC39,
// своя форма и несовместимость с будущим рантаймом
function logged(target: any, propertyKey: string,
                descriptor: PropertyDescriptor) {
    const original = descriptor.value;
    descriptor.value = function (...argsany[]) {
        console.log(`calling ${propertyKey}`);
        return original.apply(this, args);
    };
}
class Service {
    @logged
    run() {}
}

// *** in version 5.0: ***
// декораторы по стандарту TC39, без экспериментального флага
function loggedStd<ThisArgs extends any[]Return>(
    target: (this: This, ...argsArgs) => Return,
    context: ClassMethodDecoratorContext
) {
    return function (this: This, ...argsArgs): Return {
        console.log(`calling ${String(context.name)}`);
        return target.call(this, ...args);
    };
}
class ServiceStd {
    @loggedStd
    run() {}
}