Правильное использование IdentifiedReference и {wrappedReference: true}

На этом я не заканчиваю понимать это и не хочу загрязнять исходную проблему. нужно использовать всегда{ wrappedReference: true } с IdentifiedReference?

Потому что это не удается:

@Entity({ collection: "account" })
export class AccountEntity implements IdEntity<AccountEntity> {
    @PrimaryKey()
    public id!: number;

    @OneToOne(() => ArtistEntity, "account", { wrappedReference: true })
    public artist!: IdentifiedReference<ArtistEntity>;
}

@Entity({ collection: "artist" })
export class ArtistEntity implements IdEntity<ArtistEntity> {
    @PrimaryKey()
    public id!: number;

    @OneToOne(() => AccountEntity, { wrappedReference: true })
    public account!: IdentifiedReference<AccountEntity>;
}

с:

src / entity /artistEntity.ts(15,38): ошибка TS2345: аргумент типа '{ wrappedReference: boolean; }'не может быть назначен параметру типа'"id" | "имя" | "пароль" | "электронная почта" | "изображение" | "художник" | "коллекции" | "студии" | ((e: AccountEntity) => любой) | undefined'. Литерал объекта может указывать только известные свойства, а "wrappedReference" не существует в типе "(e: AccountEntity) => any".

Итак, это было бы правильно?

@Entity({ collection: "account" })
export class AccountEntity implements IdEntity<AccountEntity> {
    @PrimaryKey()
    public id!: number;

    @OneToOne(() => ArtistEntity, "account", { wrappedReference: true })
    public artist!: IdentifiedReference<ArtistEntity>;
}

@Entity({ collection: "artist" })
export class ArtistEntity implements IdEntity<ArtistEntity> {
    @PrimaryKey()
    public id!: number;

    @OneToOne(() => AccountEntity)
    public account!: IdentifiedReference<AccountEntity>;
}

1 ответ

Решение

Проблема в том, что вы пытаетесь использовать второй параметр @OneToOne декоратор для объекта параметров, но в настоящее время поддерживается только для первого или третьего параметра

// works if you use the default `TsMorphMetadataProvider`
@OneToOne()
public account!: IdentifiedReference<AccountEntity>;

// use first param as options
@OneToOne({ entity: () => AccountEntity, wrappedReference: true })
public account!: IdentifiedReference<AccountEntity>;

// use third param as options
@OneToOne(() => AccountEntity, undefined, { wrappedReference: true })
public account!: IdentifiedReference<AccountEntity>;

// you can also do this if you like
@OneToOne(() => AccountEntity, 'artist', { owner: true, wrappedReference: true })
public account!: IdentifiedReference<AccountEntity>;

Но это изменится до финальной версии v3, поэтому, если вы будете использовать TsMorphMetadataProvider (по умолчанию), он всегда будет работать даже без явного wrappedReference: true.

Вот проблема, на которую вы можете подписаться в связи с предстоящим изменением: https://github.com/mikro-orm/mikro-orm/issues/265

(речь идет о допустимости значения NULL, но это еще один побочный эффект этого изменения)

Другие вопросы по тегам