如何扩展从 'nest-keycloak-connect' 导入的 AuthGaurd Class

How to extend AuthGaurd Class Imported from 'nest-keycloak-connect'

我在 nestjs 中使用 nest-keycloak-connect 我想创建自己的 class 从 AuthGuard class 扩展一些自定义功能

我试过了,效果很好


  @Injectable()
  export class KeycloakAuthGuard extends AuthGuard implements CanActivate {
    canActivate(context: ExecutionContext) {
        const value = super.canActivate(context);
        const [request] = extractRequest(context);
        console.log(' ++++++++++++++++++ ++++++++++++++ ', request.user); //getting user here

        // Some Custom functionality here..... like call any external request

        return value;
    }
  }

但是我需要添加一个构造函数,这样我就可以在这里使用一些服务,比如HttpService 谁能帮帮我,我该怎么办?

constructor(private http: HttpService) { super() //contructor requires 4 arguments }

如果我给构造函数参数像

constructor(
        private http: HttpService,
        @Inject(KEYCLOAK_INSTANCE)
        private keycloak: any,
        @Inject(KEYCLOAK_CONNECT_OPTIONS)
        private keycloakOpts: any,
        @Inject(KEYCLOAK_LOGGER)
        private logger: Logger,
        private readonly reflector: Reflector,
    ) {
        super(
            keycloak,
            keycloakOpts,
            logger,
            reflector
        );
    }

我遇到了这个错误

Class 'KeycloakAuthGuard' incorrectly extends base class 'AuthGuard'. Types have separate declarations of a private property 'keycloak'.

class AuthGaurd 您可以在这里找到代码: https://github.com/ferrerojosh/nest-keycloak-connect/blob/master/src/guards/auth.guard.ts

nest-keycloak-connect 包 https://www.npmjs.com/package/nest-keycloak-connect

在 Typescript 中,当您为构造函数 属性(例如 public、private)包含修饰符时,您使用的是短格式语法,该语法还定义了 class 成员和将构造函数参数分配给该成员。

class MyClass {
  constructor(private readonly thing: number) { }
}

的缩写形式
class MyClass {
  private readonly thing: number;

  constructor(thing: number) { 
     this.thing = thing;
  }
}

因此,如果您只是删除 private keycloak: any, 前面的 private 修饰符,您将简单地接收该值作为构造函数参数,然后您可以将其传递给 super 而不会发生冲突在基础 class

的现有 class 成员上

好的,我从图书馆作者那里得到的是

重命名构造函数属性,因为它们会与超类冲突。

constructor(
  @Inject(KEYCLOAK_INSTANCE)
  private keycloak1: any
  @Inject(KEYCLOAK_CONNECT_OPTIONS)
  private keycloakOpts1: any,
  @Inject(KEYCLOAK_LOGGER)
  private logger1: Logger,
  private readonly reflector1: Reflector
)