Как я могу продлить класс миксина? - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь расширить класс Typescript, сгенерированный Prisma , чтобы я мог добавить некоторые дополнительные функции. Генерация кода создает интерфейс, который описывает все члены класса следующим образом:

export interface Prisma {
  user(id: string) => User
}

Реализация этого интерфейса генерируется следующим образом:

export interface ClientConstructor<T> {
  new (args?: MyArgs): T;
};

export function makePrismaClientClass<T>(args: MyArgs): T {
  return class Client : BaseClass {
    constructor(args: MyArgs) {
      super(args)
    }
  } as any
};

export const Prisma = makePrismaClientClass<ClientConstructor<Prisma>>(args);

Что означает, что я могу использовать следующее код для получения пользователя

const db = new Prisma();
const user = db.user('user_id');

Я бы хотел расширить поведение этого класса, поэтому я написал следующее:

class MyPrisma extends Prisma {
  constructor(args?: MyArgs) {
    super(args);
  }
}

Теперь я могу сделать

const db = new MyPrisma();
const user = db.user('user_id');

И получите список пользователей. Однако если я попытаюсь изменить переопределение метода user (даже не меняя ничего) следующим образом:

class MyPrisma extends Prisma {
  constructor(args?: MyArgs) {
    super(args);
  }

  user = (id: string) => {
    super.user(id);
  }
}

при вызове db.user, теперь я получаю ошибку во время выполнения TypeError: (intermediate value).user is not a function - предположительно потому, что user не существует для типа ClientConstructor.

Можно ли как-нибудь заставить мой класс расширить класс, возвращаемый makePrismaClientClass, а не ClientConstructor?

...