Generic Resolver Guard в Angular

Можно ли создать общий Resolver Guard в Angular? Я пробовал следующее:

export class BaseResolver <E extends BaseEntity, S extends BaseService> implements Resolve<E> {
      constructor(private service: S, private router: Router) {}

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): 
        Observable<E> {

        let id = route.paramMap.get('id');

        return this.service.getItem(id).pipe(
          take(1),
          map(item => {
            if (item) {
              return item;
            } else { // id not found
              this.router.navigate([this.service.getUrl()]);
              return null;
            }
          })
        );
      }

Я получаю ошибки компиляции при попытке настроить роутер

(Пользователь реализует интерфейс BaseEntity)

resolve: {
              user: BaseResolver<User, UserService>
            }

Ошибка L

Type 'Observable<BaseEntity>' is not assignable to type 'Observable<E>'.
  Type 'BaseEntity' is not assignable to type 'E'

Вы должны вызвать this.service внутри метода разрешения. разрешить (маршрут: ActivatedRouteSnapshot, состояние: RouterStateSnapshot): Observable <any> | Promise <any> | any {let id = route.paramMap.get ('id'); вернуть this.service.getItem (id); }

notionquest 14.05.2018 11:12

Я реализовал именно так, но получаю ошибку компиляции, как описано. См. Отредактированный код.

Ronen 14.05.2018 13:47
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
2
1 345
1

Ответы 1

Метод resolve должен возвращать тот же тип объекта, который определен в интерфейсе Resolve.

Разрешить определение интерфейса: -

interface Resolve<T> {
  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<T> | Promise<T> | T
}

Решение 1: -

Если вы хотите иметь конкретный тип, определите базовый абстрактный класс, расширьте его различными классами и верните класс из метода разрешения.

@Injectable()
export class TodoResolver implements Resolve<BaseEntity> {
  constructor(private service: SomeService, private router: Router) { }

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot,
  ): Observable<ChildBaseEntity> {

    let id = route.paramMap.get('id');    
    return this.service.somemethod('id');    
  }
}


export abstract class BaseEntity {};

export class ChildBaseEntity extends BaseEntity {};

Решение 2: -

Простым решением было бы изменить тип метода разрешения на Observable<any>.

Я не уверен, будет ли решение 2 приемлемым для вас, поскольку вы ожидаете некоторой безопасности типа.

Другие вопросы по теме