Is it possible to dynamically manage property assignments within a class expression?

Suppose I have the following code snippet:

const c = class {
  xyz = 123;
};

With that in place, I can then execute:

new c().xyz // --> 123;

But is there a way to provide an object to automatically assign properties? In simpler terms, can I achieve something like this:

const props = { foo: 'baz!', bar: 555 };
const c = class {
  ...props... // convert props to properties magically -- but how?
};

And then use it as follows:

new c().foo; // --> 'baz!'
new c().bar; // --> 555

Is there a method to accomplish this?

Answer №1

There isn't a perfect way to ensure complete type safety. Although, using Object.assign(this, props) in the constructor can help bring all properties into the instance. However, TypeScript may not fully understand the impact of this function on the type.

The downside is that manual casting will be necessary, which makes it less than ideal.

To simplify this process, you can create a generic function:

function makeClass<T>(props: T) {
  return class {
    constructor() {
      Object.assign(this, props);
    }
  } as { new (): T }
}

const C = makeClass({ foo: 'baz!', bar: 555 });
const c = new C();
console.log(c.bar); // returns without error
console.log(c.foo); // returns without error
console.log(c.nope); // generates an error

Take note of as { new (): T }, indicating that this value can be invoked with new to return an interface matching your props T.

This approach might become more complex if your class includes additional properties, but it's a good starting point.

Playground

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

A glitch was encountered during the execution of the ionic-app-scripts subprocess

I recently started using Ionic 3 and created an application that I'm trying to convert into an APK. To generate a debug (or testing) android-debug.apk file, I used the following CLI command: ionic cordova build android --prod The pages are declared ...

Checkbox: Customize the appearance of the root element

I am trying to modify the root styles of a Checkbox component, but it is not working as expected. Here is my code: <CheckboxItem onChange={()} checked={isChecked} label="Show Checkb ...

Definition duplication is necessary for TypeScript object properties

I'm currently facing a challenge with TypeScript as I attempt to develop a function that properly assigns default values for an optional object within another object. Even though I am setting up everything in the parameters, I keep encountering an er ...

Leveraging event listeners in conjunction with React's useEffect function

Check out the code example on Code Sandbox here Hey there, I'm trying to implement a feature where clicking a button inside a container displays a box. I've set up an event listener so that when you move your mouse outside the container, the box ...

What steps are required to generate dist/app.js from a script file in my TypeScript project?

I am currently working on a project using node, express, and TypeScript. When I run npm run build, everything builds without any issues. However, when I attempt to run npm run start, I encounter the following error: @ruler-mobility/[email protected] /User ...

Encountering a TypeScript error when trying to establish a connection to MariaDB using node

working with mariadb npmjs version: 2.1.2 import mariadb from "mariadb"; const pool = mariadb.createPool({host: process.env.DBHOST, user: process.env.DBUSER, password: process.env.DBPASS, port: process.env.DBPORT, connectionLimit: process.env.DBCONNLIMIT, ...

Tips for integrating an arrow function as a property in a functional programming approach using JavaScript or TypeScript

Suppose I were to create a constructor for a functional class with TypeA as an argument, and TypeB representing the type of the class itself. In such cases, I can implement it using: functionName(argument: TypeA): TypeB { this.property = argument; ...

Unable to detect tsc after installing globally within Windows Sandbox

I followed the instructions provided here to install TypeScript globally. npm install -g typescript After installing both inside vscode and outside, I encountered an issue where tsc --version does not work and shows 'tsc is not recognized'. Int ...

Challenges with Spreading Props in TextField Component After MUIv4 Upgrade with TypeScript

Latest Material-UI Version: 4.1.0 I'm encountering difficulties in passing props to an abstracted <TextField /> component that I've developed. Below is the snippet of code: PasswordInput.tsx import * as React from 'react' impo ...

Updating the array in React state does not work properly

Update: Visit the Snack Expo for the latest version. I have a page that displays a list. When I click on a Delete button, my goal is to remove the item with a specific id from the list. The code snippet is shown below: import { useState, memo, useCallbac ...

The integration of ngx-translate with an HTTP interceptor is currently experiencing difficulties

Using ngxtranslate for application translation has been seamless so far. However, I am facing an issue with the HttpInterceptor. This interceptor attempts to retrieve data from local storage at the start and displays a dialog prompting you to either load t ...

Having trouble retrieving information from combineLatest in Angular?

I'm having some trouble with fetching files to include in the post logs. It seems that the data is not being passed down the chain correctly when I attempt to use the pipe function after combining the latest data. This code snippet is part of a data r ...

Encountering difficulty invoking a component method from d3's call() function

My current setup involves using D3 to drag and drop links in the following manner: .call(d3.drag() .on("start", linkDragStart) .on("drag", linkDragging) .on("end", linkDragEnd)); Recently, I decided to extract this functionality into a separate met ...

What is the specific event type triggered by the onError event when utilizing an img tag?

I'm attempting to display an image. If the URL fails to load, I want to show a different image instead. Currently, my code is functioning properly, but I am utilizing type "any" for the event. What should be the appropriate type for the event? functi ...

What is the best way to manage data types using express middleware?

In my Node.js project, I am utilizing Typescript. When working with Express middleware, there is often a need to transform the Request object. Unfortunately, with Typescript, it can be challenging to track how exactly the Request object was transformed. If ...

What are some ways to establish a connection with the store in components that are not using React

It's been a struggle trying to connect to the store using non-react components. Whenever I attempt to use getState or dispatch in a non-react class like this: createStoreWithApi(api).dispatch(isLoading(true)), it ends up creating a new instance of the ...

The use of BaseJQueryEventObject and JQueryEventObject is no longer recommended. What is the alternative to replace them?

Transitioning from jQuery v2 to jQuery v3, the interfaces such as BaseJQueryEventObject in type definitions are now deprecated. What should be used as a replacement in the code? For instance, when working with angularjs, functions may look like this: pu ...

Tips for passing configuration constants from HTML to a class in Angular 2 for reusing classes

Suppose I am looking to efficiently reuse my Angular 2 components, how can I input configuration directly into the HTML and then pass it to the respective class? However, could this method be vulnerable to potential manipulation in the HTML code by unautho ...

Tips for minimizing Ant Design bundle size with TypeScript in a Next.js project using Less styles

While working on my Next.js application, I observed that the file sizes are quite large during the build process. Interestingly, the size remains consistent across pages, indicating that the entire AntD package is being imported. Page ...

``Using backticks to denote HTML syntax - Leveraging Google Charts to create

Has anyone found a way to incorporate HTML in ticks within a Google chart? I am attempting to insert a weather icon from This is my current attempt: const dailyData = new google.visualization.DataTable(); dailyData.addColumn('timeofday' ...