Вы не можете получить доступ к полям экземпляра в параметрах декоратора.Декоратор применяется для класса, а не для экземпляра.
Простым решением является передача имени диалогового поля, но это означает, что поле должно быть общедоступным.
Вам также нужно изменить способ пересылки параметров и this
.Так как нам нужен доступ к фактическому, переданному в этом, мы не можем использовать функцию стрелки, и нам нужно использовать apply
для пересылки this
class HeroComponent {
constructor(public dialog: MatDialog) { }
@confirmByDialog("dialog") // Checked by the compiler.
deleteHero() { }
}
function confirmByDialog<K extends string>(dialog: K) {
return (target: Record<K, MatDialog>, key: string, descriptor: any) => {
const originalMethod: Function = descriptor.value;
descriptor.value = function (this: Record<K, MatDialog>, ...args: any[]) {
const dialogRef = this[dialog].open(ConfirmationDialogComponent);
return dialogRef
.afterClosed()
.subscribe((confirmed: boolean) => {
if (confirmed) {
originalMethod.apply(this, ...args);
}
});
};
return descriptor;
};
}