What is the best way to programmatically generate a service within Angular?

Is there a way to dynamically create services at runtime using a string name (like reflection)? For example:

let myService = new window[myClassName](myParams);

Alternatively, you could try:

let myService = Object.create(window[myClassName].prototype);
myService.constructor.apply(myService, myParams);

I have explored the Injector class, but it requires a type instead of a string (https://angular.io/api/core/Injector). Do you have any ideas on how to achieve this?

Answer №1

One way to utilize the Injector with strings is by specifying your providers as needed. For example, Angular's documentation shows how `[provide: Square]` can be shorthand for `

[provide: Square, useClass: Square]
(alternatively, you can use `useFactory` instead of `useClass` if you want to handle service instantiation yourself). You have the flexibility to change the first parameter (provide) to any Symbol or even a string of your choice.

To see this concept in action, check out the Proof of Concept I created on StackBlitz.

Answer №2

Give this a shot

object = new globalThis["myCustomClass"]();

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

npm encountered an issue when attempting to install a package from a local directory: EISDIR: illegal operation on a directory, read

While attempting to add my compiled TypeScript output as a local package using npm, this error appears: $ npm install --save ../app/out npm ERR! eisdir EISDIR: illegal operation on a directory, read npm ERR! eisdir This is most likely not a problem wit ...

How can I utilize an angular directive to deactivate a component when the escape key is pressed?

Here is my approach to closing a popup by pressing the escape key. @Directive({ selector: '[escapeHostDestroy]', }) export class DestroyPopUpOnEscapeDirective { constructor( private renderer: Renderer2, private el: ElementRef, ...

Which to choose, setInterval or rxjs interval?

Many discussions have taken place on this topic, but I am still unsure about which approach is best for my specific use case. I have a method that needs to be called every 3 seconds in order to receive updated stock details. ngOnInit() { this.getUpdat ...

Enhance your Angular-material calendar by incorporating tooltips for dates

I am attempting to include a tooltip on Angular Material calendar dates. I have experimented with using matToolTip but unfortunately, nothing appears when hovering over the dates. <mat-calendar [dateClass]="dateClass()" [startAt]="month" [selected]=" ...

Tips for initializing constructor arguments using JSON during object instantiation in TypeScript

Let's consider a scenario where we have the following class: export class PersonInformation { constructor( public firstName: string = "", public lastName: string = "", public middleName: string = "", ) { } } Now, we&a ...

Creating QR codes from raw byte data in TypeScript and Angular

I have developed a basic web application that fetches codes from an endpoint and generates a key, which is then used to create a QR Code. The key is in the form of an Uint8Array that needs to be converted into a QR Code. I am utilizing the angularx-qrcode ...

Setting the initial state for a React toggle custom hook

After clicking a chevron button, an accordion component below it expands to display its children components. The goal is to ensure that each chevron button operates independently so that only the clicked button expands its related accordion. Upon initial ...

The data type 'T[K]' does not meet the required conditions of 'string | number | symbol'

I am currently in the process of developing a straightforward function to eliminate duplicates from an array using TypeScript. While I acknowledge that there are numerous methods to accomplish this task, my main objective is to enhance my understanding of ...

Issue: Trying to emit before Angular Webpack plugin has been initialized (Error: Emit attempted before Angular Webpack plugin initialization)

Currently, I am working on a project in Angular 15 where I am migrating code from Angular version 5. Despite fixing all the errors, I'm facing one particular issue. Here are the details of my current Angular version: Angular CLI: 15.2.10 Node: 18.18. ...

Leverage a TypeScript property descriptor to substitute the accessors without compromising on composability

Is there a way to create a TypeScript property descriptor that can override accessors and still be easily composed with other functionality? ...

Retrieve the object from the data received from the HTTP GET API call

I have a question that has been asked before, but I am unable to achieve the desired result with my current approach. When my service retrieves data from an API, it returns results in the following format: { "nhits": 581, "paramete ...

Primeng - Displaying names in editable datatable with multiSelect feature

Lately, I have been exploring primeng and I am interested in creating an editable table that includes a multi-select column. After some experimentation, I managed to achieve this result. However, my issue is that I want the winners field (which contains a ...

Identify potential interference with Sentry.captureMessage(...) or Sentry.captureException(...) functions within a JavaScript application, such as being obstructed by an ad-blocking extension

Overview Our Javascript application uses Angular and TypeScript, with Sentry.io for error reporting. If an error occurs, a custom modal allows users to leave a message, which should be sent to Sentry when they click submit. Issue We have noticed that mes ...

Is it possible to have unique styles for individual tabs in a mat-tab-group using Angular Material?

Is it possible to have different text colors for each tab in a mat-tab-group and change the color of the blue outline at the bottom? If so, can you provide guidance on how to achieve this? Here is the default appearance of the tabs in my app: https://i.st ...

How can we limit the CSS properties that can be used in an interpolated manner by defining a restricted TS type for CSS props based on emotions?

When dealing with emotions, how can we specify a restricted TS type for the css prop to only allow certain css properties to be interpolated? For instance, consider the following scenario: // This is considered valid css = {{ color: 'white', ...

What role does enum play in typescript?

What is the purpose of an enum in typescript? If it's only meant to improve code readability, could we achieve the same result using constants? enum Color { Red = 1, Green = 2, Blue = 4 }; let obj1: Color = Color.Red; obj1 = 100; // IDE does not sh ...

What is the process for modifying href generation in UI-Router for Angular 2?

I am currently working on implementing subdomain support for UI-Router. Consider the following routes with a custom attribute 'domain': { name: 'mainhome', url: '/', domain: 'example.com', component: 'MainSiteC ...

Include a search query parameter in the URL by adding "?search=" to connect with a

In my react/typescript application, I have a client and server setup. The client requests data from the server and displays it using React. When making a request for data on the client side, this is how it's done: export const createApiClient = (): A ...

Is there a simple method to eliminate devDependencies from the ultimate package using esbuild?

My current challenge involves using esbuild to package my lambda functions. However, during the build generation for deployment, I encounter an alert indicating that the package size exceeds the limit, as shown in the image below. File too large In explo ...

Why is the Last Page display on pagination showing as 3 instead of 2 per items?

When working on Angular 13, I encountered an issue with applying pagination numbers like 1, 2, 3, etc. The problem I faced was that the last page Number should be 2, but it is displaying as 3. Why is this happening? To investigate the issue, I tested my ...