Making an interface in typescript and using it to create an object with specified keys and values

Is it possible to automatically generate an object that mirrors an interface in both keys and values?

Consider the following interface:

interface Person {
  name: string;
  age: number;
}

I want to create an object like this:

const personFieldNames = {
  name: "name",
  age: "age",
};

Answer №1

Creating an object from an interface is not possible due to the fact that interfaces only exist during compile time. However, you can create a type based on an existing object using the typeof keyword.

const animal = {
  species: 'dog',
  age: 3
}

type Animal = typeof animal

const spot: Animal = {
  species: 'dog',
  age: 5
}

Answer №2

If you're trying to loop through properties of an Interface, you'll hit a roadblock because they are only accessible at compile time. However, one workaround is to create an object based on your Interface and then iterate over its properties.

interface Person {
  name: string;
  age: number;
}

const personFields: Person = {
  name: "John",
  age: 30,
};

let newObject = {};

Object.keys(personFields)
.forEach(key => {
    newObject = {...newObject, [key]: key};
})

console.log(newObject);

Output:

[LOG]: {
  "name": "name",
  "age": "age"
} 

Alternatively, you can utilize the ts-transformer-key library mentioned here

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

Is there a method to incorporate absolute paths in SCSS while working with Vite?

Currently, I am experimenting with React + Vite as webpack seems to be sluggish for me. My goal is to create a project starter, but I am facing difficulties in getting SCSS files to use absolute paths. Despite including vite-tsconfig-paths in my vite.confi ...

Can someone help me figure out how to simulate an express middleware class method using jest and supertest?

I'm facing some challenges trying to achieve the desired outcome when mocking a method in a class using jest and supertest. I'm specifically looking for a solution that can help me bypass the verifyAuthenticated method with a mocked version in or ...

Errors slipping through the cracks of Express middleware

When it comes to using express and typescript, I am attempting to create a middleware for error handling similar to Sentry. Below is the code snippet: const catchError = ( error: Error, req: Request, _res: Response, next: any ) => { console. ...

What is the process for restoring or installing chai typings that have been specified as devDependencies?

After installing chai typings using the typings tool with the command provided, I am encountering an issue where chai is not being installed on the build server. typings install chai --save-dev The devDependencies section in my typings.json file is as fo ...

Retrieve the 90 days leading up to the current date using JavaScript

I've been searching for a way to create an array of the 90 days before today, but I haven't found a solution on StackOverflow or Google. const now = new Date(); const daysBefore = now.setDate(priorDate.getDate() - 90); The result I'm looki ...

Implement a Vue TypeScript class component using the vuedraggable library

I am facing an issue while trying to import sortableJs/vuedraggable with a TS class component. Interestingly, when I utilize vuedraggable with a regular JS standard component, everything works smoothly. Below is the code snippet showing vuedraggable with ...

concealing a div within an *ngFor iteration

Attempting to insert a form within a *ngFor loop in order to replicate a button. html file: <div *ngFor="let passenger of passengerForm;let i=index;"> <form> <mat-form-field> <input matInput type="text" placeholder="Ent ...

What is the best way to ensure that my variable updates whenever its reference changes?

Having trouble updating an Angular2 component's variable that is tied to a variable in another service? You're not alone. I've been struggling to get it to update without constantly resetting the variable. In my component, I have the follow ...

Experimenting with Cesium using Jasmine (Angular TypeScript)

I have a TypeScript app built using Angular that incorporates Cesium: cesium-container.component.ts import { Component, ElementRef } from '@angular/core'; import { Viewer } from 'cesium'; import { SomeOtherCesiumService } from 'sr ...

Utilize an array as the response model in Amazon API Gateway using the AWS CDK

I am currently in the process of developing a TypeScript AWS CDK to set up an API Gateway along with its own Swagger documentation. One of the requirements is to create a simple endpoint that returns a list of "Supplier", but I am facing challenges in spec ...

Angular's custom error handler is failing to function as intended

Currently, I am facing a challenge in implementing a custom error handler for my angular application. The issue seems to be working, but under some peculiar conditions only. To view the implementation, you can check out the StackBlitz link provided below: ...

Setting values for TypeScript objects

I am currently working on developing a custom visual using Power BI. Within my interfaces file, I have a TypeScript interface called BiHiSankey. declare module 'd3' { interface BiHiSankey { nodeSpacing: () => number; ...

Pause until the user selects either the confirm or deny option before proceeding with the next action

As a beginner in Angular, I am seeking help with my code structure. I have three files: WarningComponent (which displays a warning modal using Bootstrap), modalService (responsible for opening modals), and votingComponent. Within the votingComponent, ther ...

Special Syntax for Defining Custom Record Keys in TypeScript

In the process of creating a small library, I am focused on enhancing type safety for the following object: export const ErrorCodeMap: Record<string, [string, number]> = { NOT_FOUND: ['1001', 222], ALREADY_EXISTS: ['1002', 111 ...

Enforcing uniform data types in nested objects in TypeScript

Currently, I am in need of generating a list of constants. For instance, const Days = { YESTERDAY: -1, TODAY: 0, TOMORROW: 1, } I am looking for a method to restrict the types of all properties within Days. In other words, if I attempt to add a pr ...

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> ...

Troubleshooting TS Errors in Vue 3 and Vite with Typescript Integration

Currently experimenting with Vue 3, Vite, and TypeScript to build a Vue project. The configuration process has proven to be quite challenging. Despite consulting various documentation sources, I have not been successful in achieving my desired outcome. My ...

Tips for keeping a React-Table row expanded during re-render processes

I am working on a straightforward react-table that includes an expanded sub-component linked to a Redux state object. Whenever the sub-component is expanded, I make an API call to retrieve additional data for lazy-loading into the Redux store. The Redux s ...

Ignore a directory during TypeScript compilation

When writing code in Atom, the use of tsconfig.json to include and exclude folders is essential. For optimal intellisense functionality, the node_modules folder must be included. However, when compiling to js, the node_modules should not be compiled. To ac ...

React 18 update causes malfunctioning of react-switch-selector component

I'm facing an issue where the component is not rendering. I attempted to start a new project but it still didn't work. Is there a solution to fix this problem or should I just wait for an update from the original repository? Encountered Error: ...