Универсальный охранник резольвера в угловых - PullRequest
0 голосов
/ 14 мая 2018

Можно ли создать универсальный 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'

1 Ответ

0 голосов
/ 14 мая 2018

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

Определение интерфейса разрешения: -

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

Решение 1: -

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

@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 будетприемлемо для вас, так как вы ожидаете некоторой безопасности типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...