Factory for TypeScript Objects

I'm currently grappling with developing an object factory in TypeScript that requires all generated objects to share a common base type. However, I'm encountering difficulty in properly defining this requirement.

Below is my current approach, which TypeScript identifies as incorrect because it cannot guarantee the type T to be of type Base.

class Base {
    constructor() {}
}


class User extends Base {
    constructor() {
        super()
    }
}

class Post extends Base {
    constructor() {
        super()
    }
}

function buildObject<T extends Base>(type: typeof Base): T {
    return new type()
}

I initially attempted to introduce a new type like

type BaseInstance<T> = T extends Base
for use in this context:

function buildObject<T>(type: typeof BaseInstance<T>): BaseInstance<T> {
    return new type()
}

However, the syntax

type BaseInstance<T> = T extends Base
proved invalid.

Answer №1

Consider creating a type called BaseConstructor that can be invoked using the new keyword and will return an instance of Base. The classes Base, User, and Post all meet this type definition.

type BaseConstructor<T extends Base> = new() => T;

function buildObject<T extends Base>(type: BaseConstructor<T>): T {
    return new type();
}

const myObj: Post = buildObject(Post);

Playground Link

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

Optimizing row performance for Angular grids in the Chrome browser

When creating a component that includes a table with numerous rows, everything works well with small amounts of data. However, once the item count reaches 2000 or more, it starts lagging. Scrolling and animations become sluggish. Even after trying to impl ...

Updating token (JWT) using interceptor in Angular 6

At first, I had a function that checked for the existence of a token and if it wasn't present, redirected the user to the login page. Now, I need to incorporate the logic of token refreshing when it expires using a refresh token. However, I'm enc ...

Having trouble accessing an injector service within the promise of a dynamically loaded JavaScript function that has been assigned to a global variable

Query I am facing an issue while trying to integrate PayPal with Angular. I am encountering difficulties when attempting to call an injected service inside a function of the promise returned. Any assistance in resolving this would be greatly appreciated. ...

Optimal method for populating table filter values from query string in Typescript while handling asynchronous calls

Using Typescript for Angular, I am dealing with a table that has filters in the form of drop downs. The data for each filter is retrieved asynchronously from the backend. My challenge is to load the data for all filters while setting default values based o ...

Learn how to pass JSON data into an anchor tag with Angular router link and the query parameters attribute set as "<a ... [queryParams]="q=|JSON|

As an Angular user, I am trying to populate a query parameter with a JSON object. <ngx-datatable-column name="Sku" prop="product.sku" [flexGrow]="0.5"> <ng-template let-row="row" let-value="value" ...

The property "property" does not exist within this object

I'm currently developing a peer-to-peer payment system on the Polygon network. I've tried various solutions, such as including any, but none have been successful. Here is the error message I'm encountering: Element implicitly has an 'a ...

Preventing specific directories from being imported in a Typescript project

I am intrigued by the idea of restricting files within a specific scope from importing files from another scope. Let's consider this example: Imagine we have the following project structure: project/ ├── node_modules/ ├── test/ ├── ...

Is it necessary for Angular Reactive Form Validator to convert types before checking the value for min/max validation?

Preface: My motivation for asking the questions below stems from my experience with form.value.purchaseCost. When the <input> field does not have type=number, I receive a string instead of a number. This required me to manually convert it to Number ...

What is the rationale behind Create React App enabling the use of Array.prototype.at() even though TypeScript does not support it?

During our CRA project, we encountered a code snippet like this: const patTable = tables['pat'].at(0); The usage of the Array.prototype.at() function is causing issues in older browsers such as Chrome 89. Surprisingly, CRA did not throw any warn ...

Tips for typing a destructured object key in TypeScript

Assuming I have a query parameter from the router in my Next.js app const { query: { id }, } = useRouter(); The value of { id } is currently string | string[] | undefined. I want to send it as a parameter to another function, and I am certain that ...

How can we efficiently assign an array of JSON responses using Observables and map within a TypeScript interface, and then display it in HTML using *ngFor in Angular 2?

export interface Relation{ name: string; address: string; dob: number; } The JSON response I received is as follows: [ {"name":"John", "address":"xyz", "dob":"2000-01-10"}, {"name":"Jamie", "address":"abc", "dob":"1990-01-10"} ] The issue seems to be wi ...

Retrieve intricate information from an API, generate an array of objects, and loop through them

I am attempting to create an array of intricate objects from the following data: My goal is to utilize this object array to generate components using map() To structure the response type, I utilized : // ... other types like Tag export type DatasetInfo ...

Tips for implementing Conditional validation in form models in anugular2

I need to determine whether the required validator for Address should be applied based on the value of this.type being 2. Below is the code snippet I am using for form validation: buildForm() { this.orgForm = this.fb.group({ Name: [this.addUpd ...

Converting a ReactNode to an array: Step-by-step guide

I am attempting to develop a component where specific HTMLElements or ReactComponents are provided as follows: <ContentList> <span>Hi</span> // Child No. 1 <span>Hi2</span> // Child No. 2 <CustomComponent prop1={}& ...

The imported variables are of a union type

In my nextjs project, I developed a customized hook to determine if a specific container is within the viewport using the intersection observer. Here's the code for the custom hook: import { useEffect, useRef, useState } from 'react'; cons ...

What is the best way to deliver a file in Go if the URL does not correspond to any defined pattern?

I am in the process of developing a Single Page Application using Angular 2 and Go. When it comes to routing in Angular, I have encountered an issue. For example, if I visit http://example.com/, Go serves me the index.html file as intended with this code: ...

Access functions and attributes in separate namespaces using a callback function

Incorporating the chartjs-plugin-annotation, I am faced with the need to trigger an event once a user clicks on an annotation to display a tooltip text. The plugin offers an event handler for the click event that allows me to retrieve the clicked element: ...

Using the as operator in TypeScript for type casting a string

function doSomething(a : any) { let b = (a as Array<any>) alert(typeof b) // displays "string" } doSomething("Hello") The alert is showing "string" instead of what I anticipated, which was something along the lines of a null value. The docu ...

I am encountering an issue with importing modules from the public folder in Next.js when using TypeScript, as I am

I've been running into an issue with importing files in Next.js using TypeScript. I'm trying to use regular imports with custom absolute paths, but I keep getting a module not found error. Oddly enough, my IDE is able to locate the file when I cl ...

Guide to invoking an API in Next.js 13 by utilizing specific variables within a client component

I currently have a collection of products that are accessible on my website through a straightforward function within a server component. async function getData() { const res = await fetch(`${apiPath}`); const data = (await res.json()) as PackProps ...