Можно ли создать общий 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'
Я реализовал именно так, но получаю ошибку компиляции, как описано. См. Отредактированный код.





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