Как реализовать интерфейс, который наследует класс в Typescript?

#typescript #oop

#typescript #ооп

Вопрос:

Мне нужно реализовать некоторое количество интерфейсов (например, IUserAccess).

Все эти интерфейсы наследуют интерфейс IBase, который содержит метод Execute, поэтому я хочу реализовать IBase только один раз.

Вот так:

 class IBase{
  Execute(data: any): void{
    console.log('Execute');
  };

interface IUserAccess extends IBase {
  CheckPassword(username: string, password: string): boolean;
}

class UserAccess implements IUserAccess{
  CheckPassword(username: string, password: string): boolean {
    console.log('CheckPassword');
    Execute({...});
    ...
  }

}
  

Но IDE говорит:

 >Class 'UserAccess' incorrectly implements interface 'IUserAccess'.  
Property 'Execute' is missing in type 'UserAccess' but required in type 'IUserAccess'.
  

Как я могу решить свою проблему?

Комментарии:

1. Кажется, что когда вы расширяете класс с помощью interface, вы теряете реализацию метода, поэтому вам придется реализовать Execute в классе UserAccess.

2. Но реализация Execute в классе UserAccess — плохое решение для меня, потому что мне нужно реализовать более 20 интерфейсов, каждый из которых имеет один и тот же метод Execute, и я не хочу создавать копию тела Execute для каждой реализации интерфейса

3. Я думаю, вы можете пропустить интерфейс и просто расширить IBase подобным образом class UserAccess extends IBase и получить доступ к Execute подобным образом this.Execute({...})

Ответ №1:

Возможное решение

 class IBase{
  Execute(data: any): void{
    console.log('Execute');
  };
}

interface IUserAccess {
  CheckPassword(username: string, password: string): boolean;
}

class UserAccess extends IBase implements IUserAccess {
  CheckPassword(username: string, password: string) {
    console.log('CheckPassword');
    this.Execute({...});
    ...
    return true;
  }
}