Creating a custom object from a string enum: a step-by-step guide

For instance:

enum App {
  App1 = "my-app1",
  App2 = "my-app2",
}

const AppPaths: {
  [ App.App1 ]: string;
  [ App.App2 ]: string;
} = {
  [ App.App1 ]: "/some/path/to/app1",
  [ App.App2 ]: "/some/path/to/app2",
};

This approach is functional, but quite lengthy. I aim to streamline AppPaths so it resembles the following:

const AppPaths: { [ key: keyof App ]: string } = ...

This results in an error:

An index signature parameter type cannot be a literal type or generic type. It might be helpful to utilize a mapped object type instead.

Consequently, I attempted using a mapped object type:

const AppPaths: { [ key in keyof App ]: string } = ...

// or

const AppPaths: { [ key in keyof typeof App ]: string } = ...

Both attempts yield the following error:

Object literal may only specify known properties, and '[ App.App1 ]' does not exist in type '{ readonly [x: number]: string; toString: string; charAt: string; charCodeAt: string; concat: string; indexOf: string; lastIndexOf: string; localeCompare: string; match: string; replace: string; search: string; ... 39 more ...; [Symbol.iterator]: string; }

Can the type declaration of this object be simplified?

Answer №1

After defining the enum

enum App {
  App1 = "my-app1",
  App2 = "my-app2",
}

the type App represents the values that can be mapped over. It serves as a union of the enum's values, similar to

"my-app1" | "my-app2"
. This leads to:

const AppPaths: { [K in App]: string } = {
  [App.App1]: "/some/path/to/app1",
  [App.App2]: "/some/path/to/app2",
};

Follow this link to experiment with the code on TypeScript 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

Error: Loki cannot be used as a constructor

Can anyone assist me in understanding why this code is not functioning correctly? Here's what my index.ts file in Hapi.js looks like: import { Server, Request, ResponseToolkit } from '@hapi/hapi'; import * as Loki from 'lokijs'; ...

Can NODE_PATH be configured in Typescript?

Before, I worked on my React app with ES6 and used NODE_PATH='src' to import files starting from the src folder. However, since switching to Typescript, I've realized that NODE_PATH is not supported. After some investigation, I discovered th ...

Looking to address excessive re-renders caused by Redux on a single page and seeking assistance in identifying and resolving the problem

Currently, I am in the process of developing the dashboard website for a music theory application company. This platform will allow users to manage various aspects such as their personal information, courses, assignments, and media content. The dashboard ...

Using the ternary operator for rendering components in TSX: A beginner's guide

Currently, I am retrieving data from a server. The component to display is determined based on the result of this retrieval process. const response = fetch(url) .then((result) => result.json()) .then((data) => data) .catch((e) => { ...

Error: AppModule requires an array of arguments in order to function properly

Upon successfully compiling my Angular application and running ng serve, I encountered the following error in the browser console. AppComponent_Host.ngfactory.js? [sm]:1 ERROR Error: Arguments array must have arguments. at injectArgs (core.js:1412) at c ...

Is there a way to view the console in a released apk?

Currently working with Ionic and in need of exporting a release APK to be able to monitor the console for any potential issues. I am aware that using 'ionic cordova run --device' allows me to view the console, but it only shows a debug APK. Is t ...

Leveraging _.some in lodash

I'm working on a Typescript code where I need to check if any items in one array are present in another array. Although I am new to lodash, I thought of using _.some for this task. However, the code is currently returning false when I expected it to r ...

List in Angular remains empty

I am facing an issue with populating a simple HTML list using Angular. The problem arises when trying to display the data in the list. When I use console.log("getUserCollection() Data: ", data);, it shows an array which is fine, but console.log("getUser() ...

Typescript monorepo facing issues with module resolution in Next.js projects

In my monorepo with yarn workspaces, I have 2 Next.js projects set up. apps ┣ app-1 ┗ app-2 The problem arises when app-1 needs to import components from app-2. I add app-2 as a dependency in the app-1 project and configure the path in app-1's ...

The ts-loader seems to be malfunctioning (It appears that a suitable loader is required to handle this file type, as no loaders are currently set up to process it)

I'm currently in the process of integrating TypeScript into a JavaScript project, but it seems like webpack is not recognizing the ts-loader for files with the .tsx extension. I've attempted to use babel and even tried awesome-ts-loader, but none ...

What is the best way to retrieve a specific property from an array of objects in Angular 6 using typescript?

I am currently working on a budgeting application that incorporates an array of expenses with a price property. Each expense is defined within an Expense model in Typescript. While I can easily access the price property using ngFor loop in HTML, I'm c ...

Can the tiles in a grid-list be organized in a specific order?

I am facing an issue with a class named 'scenario' that has properties such as 'id', 'name', and 'number' among others. In the HTML, scenarios are displayed in this format: <mat-grid-list [cols]="breakpoint" r ...

Step-by-step guide to initializing a project using React with Typescript and a functional server-side script

I am working on a project that involves a React Typescript app (created using Create React App). In this project, I need to have an executable script that can run alongside the React app. Both the app and the script are intended to only run on local machin ...

Unveiling the Ultimate Method to Package Angular 2 Application using SystemJS and SystemJS-Builder

I'm currently in the process of developing an application and I am faced with a challenge of optimizing the performance of Angular 2 by improving the loading speed of all the scripts. However, I have encountered an error that is hindering my progress: ...

Issue with Ionic 2's infinite scroll not triggering method on second scroll attempt

I utilized the ion-tab element to showcase a page (inboxitem) which encompasses ion-list and makes use of ion-infinite-scroll. The following code snippet resides in inboxitem.html <ion-content class="inbox can-swipe-list"> <ion-list> ...

``Can someone provide guidance on how to showcase the validation check result for a text-field in the snackbar using Vuet

One of the challenges I'm facing in my project is implementing a validation function for the customer form. While using the vuetify validate method would be the easy way to go, I need to display the validation messages both as snackbar and next to eac ...

changing an object into an array using Angular 2's TypeScript

I am currently facing an issue where I have an object within another object, and my goal is to convert the inner object into a string separated by commas. However, when I attempt to do so, it results in an infinite loop. After making an observable http re ...

What could be the reason for mat-autocomplete not displaying the loading spinner?

Currently, I am integrating Angular Material into my Angular 11 project. One of the pages includes a mat-autocomplete component where I want to display a loading spinner while waiting for a request. Here is the code snippet I am using: component.ts this. ...

Advanced Angular2 Services Expansion

I'm looking to enhance an existing angular service (for example, Http). Requirements: The extension of the service should be done through angular's dependency injection It should be possible to extend the service multiple times using a pattern ...

Developing object in place of an array (JavaScript)

After receiving data from the back-end, I handle it within a function: getAgentSuggestionById(agentId) { this._agentsService.getAgentSuggestionById(agentId).subscribe(result =>{ this.agent = result.items.map(e => {let obj = {name: e.name ...