What is the best approach to configure a OneToOne relationship as optional for various subclass entities?

If I have a base class called Animal, with subclasses Dog and Cat.

export class Animal extends BaseEntity{
    @PrimaryGeneratedColumn()
    id:number;
}

@Entity()
export class Cat extends Animal{
   ...
}

@Entity()
export class Dog extends Animal{
   ...
}

Now, I want to establish a OneToOne relationship between them and their respective owners.

@Entity
export class Owner extends BaseEntity{
   ....
 
   @OneToOne()
   pet:???
}

The class Owner has an attribute pet that can refer to either a cat or dog. How can this be implemented using typeorm?


Or is there a better way to structure this relationship?

Answer №1

Here is a step-by-step guide on how to accomplish this task


@Entity()
@TableInheritance({ column: { type: "varchar", name: "type" } })
export class Content {
    
    @PrimaryGeneratedColumn()
    id: number;
 
    @Column()
    title: string;
    
    @Column()
    description: string;
    
}

@ChildEntity()
export class Photo extends Content {
    
    @Column()
    size: string;
    
}
@ChildEntity()
export class Question extends Content {
    
    @Column()
    answersCount: number;
    
}
@ChildEntity()
export class Post extends Content {
    
    @Column()
    viewCount: number;
    
}

Answer №2

In typeorm, utilize @ChildEntity() for child entities and @Entity() for the main class.

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Retrieve information using Angular's EventEmitter

Recently I started learning Angular and encountered a challenging issue that has kept me occupied for the past few hours. I have implemented a parent-child relationship between two components, with a need to share a boolean variable from the parent to the ...

Enhancing validation in Express with custom Typescript types for validation in Express Validator

I encountered an error while using the custom method of the express validator Issue: Argument of type '(userDoc: User | null) => Promise<never> | undefined' is not assignable to parameter of type '(value: User | null) => Promise ...

"Functioning seamlessly in Chrome, yet encountering compatibility issues in Firefox - the

ERRORS ENCOUNTERED IN FIREFOX: ReferenceError: reference to undefined property G.search es6-shim.min.js:10:7752 ReferenceError: reference to undefined property G[e] es6-shim.min.js:10:1 mutating the [[Prototype]] of an object will cause your code to run v ...

Tips for creating a TypeScript generic that ensures no SubType property is overly restricted

I am looking to create a function that can generically return a partial object of a specific type, where the object has an ID property. When working with a concrete type, such as the example below, the function works smoothly: type Person = { id: string; ...

Exploring Angular2's interaction with HTML5 local storage

Currently, I am following a tutorial on authentication in Angular2 which can be found at the following link: https://medium.com/@blacksonic86/authentication-in-angular-2-958052c64492 I have encountered an issue with the code snippet below: import localSt ...

Indexing types unexpectedly behaving and generating errors that were not anticipated

I find the code below quite strange... export class Collection { private data: {[k: string]: any} = {}; constructor () { // This part works fine this.data["hello"] = "hello"; // Unexpectedly works this.data[2] = 2; ...

Receiving an error when trying to import the 'marked' module into an Angular project

Working on a project with Angular 15, I recently added marked to transform MarkDown text to HTML using an Angular pipe. However, no matter how I import it, I can't seem to get it working and keep encountering errors. I followed these steps: npm i mar ...

Ensure that the interface limits the key value to match precisely the value of a constant in Typescript

Seeking assistance in understanding how to enforce a specific type for an optional key within an interface: const FIRST = "FIRST" const SECOND = "SECOND" interface TSomeInterface { element: Element order?: typeof FIRST | typeof ...

What could be causing the issue with dayjs dynamic importing in TypeScript?

Currently, I am developing a web screen within a .NET application and facing an issue with sending datetime preferences from the system to the web screen using CefSharp settings. AcceptLanguageList = CultureInfo.CurrentUICulture.Name In my TypeScript code ...

Is there a way in Typescript to filter for the first instance of a unique object in an array of objects?

Having an array of JSON objects like this, the task is to iterate through it and retrieve the first occurrence of 'appname', such as 'app1' or 'app2', and store the entire object for each... myArray[ { ...

Retrieving Age from HTML5 Date Input in Angular 2+

I need assistance in calculating the age from a date input in an existing form using HTML5 and Angular. I want to achieve this without requiring the user to click anything. Although I am able to retrieve the date, the format is causing issues with my code ...

Exploring an array in React using typescript

I have a persistent data structure that I'm serving from the API route of my Next.js project. It consists of an array of objects with the following properties: export interface Case { id: string; title: string; participants: string[]; courtDat ...

What causes parameters to be undefined when making a DELETE request in my Next.js application running on version 14.1.4?

I am encountering an issue with my DELETE mapping export async function DELETE({params} : {params: {id: string}}) { try { const loanToDelete = await prisma.loan.findUnique({ where: { id: parseInt(params.id) } }) if (!loanToDelete ...

Angular: Material Button that Adjusts According to Header Size

How can I adjust the size of a mat-icon to match the header size? Despite my efforts, the arrows remain small. <h1> <button mat-icon-button (click)="testEvent()"> <mat-icon>keyboard_arrow_up</mat-icon> < ...

The mystery of the undefined return value in my Ionic v4 get function

I attempted to retrieve my location by saving the latitude and longitude, but my declared variable isn't returning anything. Take a look at my code snippet: public device_location: any = {}; constructor(private geolocation: Geolocation) { this.s ...

Meta fields in the Vue Router

Is it feasible to create custom properties while defining routes for VueRouter? Specifically, I am interested in setting up a route structure like the one below, where I can specify a component for an optional property "menu" for most routes in my applicat ...

Is it possible to dynamically adjust the size of the CircleProgressComponent element in ng-circle-progress?

For my current Angular 11 project, I am facing the challenge of dynamically changing the size of the ng-circle-progress library's CircleProgressComponent element. After some research, I discovered that the element's size can be adjusted by apply ...

What is the best approach for organizing type declaration files when using Vite in a React TypeScript application?

Currently in the process of transitioning my application from Webpack to Vite. Seeking guidance on the optimal method for including the following: /// <reference types="vite/client" /> There is an existing file types/global.d.ts, and I&ap ...

Can someone guide me on identifying the type of object in React/Typescript?

Can anyone help me remove this unnecessary definition? const [nextLocation, setNextLocation] = useState(null) as any[]; I have been struggling with this in my React Router 6 project. I've looked through the documentation but haven't found a suit ...

What is the meaning of '=>' in typescript/javascript?

I keep coming across lots of '=>' in the code I found on the internet. Could someone please explain it to me as if I were 5 years old? (I'm searching for the specific code, and I'll share it here once I locate it).. Found it: ...