Невозможно выполнить наследование одной таблицы с использованием определений схемы сущностей в Typeorm

#javascript #typescript #typeorm #single-table-inheritance

Вопрос:

Я безуспешно пытался добиться наследования одной таблицы с помощью typeorm, используя определения схем. Мои сущности имеют иерархию с абстрактным участником базового класса и хотели бы использовать свойство перечисления, названное type в качестве дискриминатора.

Дискриминатор перечисления

 export enum AttendeeType {
  Member = 'member',
  Guest = 'guest',
}
 

Интерфейсы

 export interface IAttendee extends IPrimaryKey {
  type: AttendeeType;
  _username?: string;
  givenName: string;
  familyName: string;
  sessionToken: string;
  isHost: boolean;
  meeting: number;
}

export interface IGuest extends IAttendee {
  test?: string;  //this is to work around empty columns not being allowed in schema definitions
}

export interface IMember extends IAttendee {
  _username?: string;
}
 

Определения схем

 export const AttendeeSchema = new EntitySchema<IAttendee>({
  name: 'attendees',
  target: Attendee,  //tried setting targets explicitly to get inheritance
  columns: {
    ...primaryKeySchema,
    type: {          //no way to indicate this is the discriminator
      type: 'enum',
      enum: AttendeeType,
      nullable: false,
      default: AttendeeType.Guest,
    },
    givenName: {
      type: 'varchar',
      name: 'name_givenName',
      length: 50,
      nullable: false,
    },
    familyName: {
      type: 'varchar',
      name: 'name_familyName',
      length: 50,
      nullable: false,
    },
    vonageSessionToken: {
      type: 'varchar',
      length: 500,
      nullable: false,
    },
    isHost: {
      type: 'boolean',
      nullable: false,
      default: false,
    },
  },
  relations: {
    meeting: {
      type: 'many-to-one',
      target: Meeting,
      nullable: false,
      joinColumn: true,
      orphanedRowAction: 'delete',
    },
  },
});

export const GuestSchema = new EntitySchema<IGuest>({
  name: 'guests',
  target: Guest,
  extends: 'attendees',
  type: 'entity-child',
  columns: {
    test: {    //trying to work around failure with empty columns definition
      type: 'varchar',
      length: 10,
      nullable: true,
    },
  },
});

export const MemberSchema = new EntitySchema<IMember>({
  name: 'members',
  target: Member,
  extends: 'attendees',
  type: 'entity-child',
  columns: {
    _username: {
      type: 'varchar',
      name: 'username',
      length: 36,
      nullable: true,
    },
  },
});
 

Я попытался установить цели для реализаций класса сущностей, а также разрешить ему использовать имя по умолчанию. Установка типа схемы entity-child в значение должно указывать на то, что это наследование одной таблицы, но иерархия наследования обнаружена неправильно.

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

Я отладил в EntitySchemaTransformer и EntityMetadatBuilder, но, к сожалению, не смог найти ничего, что привело бы меня к тому, как STI будет настроен с помощью определений схемы.