Exploring ways to iterate over object properties in TypeScript

I'm trying to improve my code by avoiding repetitive lines like this:

handleUserChange?.({ target: { name: 'first_name', value: rentalOrder?.address?.first_name } })
handleUserChange?.({ target: { name: 'last_name', value: rentalOrder?.address?.last_name } })
handleUserChange?.({ target: { name: 'address_line_one', value: rentalOrder?.address?.address_line_one } })

Instead, I came up with a more efficient solution:

const fieldsFromDeliveryAddress = ['first_name', 'last_name', 'address_line_one', 'post_code', 'city', 'phone']
fieldsFromDeliveryAddress.forEach(fieldName => handleUserChange?.({ target: { name: fieldName, value: rentalOrder?.address?.[fieldName] } }))

However, this approach is generating a TypeScript error (specifically on line 2 where

rentalOrder?.address?.[fieldName]
is highlighted in red):

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ first_name: string; last_name: string; email?: string | undefined; address_line_one: string; address_line_two?: string | undefined; country: string; city: string; post_code: string; phone: string; }'.

No index signature with a parameter of type 'string' was found on type '{ first_name: string; last_name: string; email?: string | undefined; address_line_one: string; address_line_two?: string | undefined; country: string; city: string; post_code: string; phone: string; }'

What would be the best way to resolve this issue?

Update

Definitions of functions involved:

const handleUserChange = ({ target }: HTMLSimpleElementEvent): void

interface HTMLSimpleElementEvent {
  target: {
    name: string
    type?: string
    value?: any
    checked?: boolean
  }
}

Answer №1

Make sure to include as const in your code. By doing this, Typescript will recognize your array as a tuple and provide accurate types for the forEach callback function.

const userFields = ['username', 'email', 'password', 'phone_number'] as const;
userFields.forEach(field => updateUserField?.({ target: { name: field, value: userInfo?.[field] } }))

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

Utilizing Typescript to define key-value pairs within a structured form

I've been creating a form structure that's functioning smoothly, but I've encountered an interesting issue with field validation in the validation part. While my Visual Code is pointing out that 'required2' in the phone constant n ...

Do not include ChangeDetectionStrategy when creating component

Is it possible to eliminate the default ChangeDetectionStrategy for each component creation? (Please note that I am working with Angular V 10 in a controlled environment for project maintenance) @Component({ xyz, changeDetection: ChangeDetectionStrategy. ...

Encountering an issue when attempting to save an excel file in Angular 8, receiving an error message that states "

When working with angular 8, I encountered an issue while trying to save an excel file. The error message displayed was as follows: ERROR TypeError: Failed to execute 'createObjectURL' on 'URL': Overload resolution failed. at Functi ...

"Angular application experiencing navigation blockage due to multiple concurrent HTTP requests using RxJS - Implementation of priority-based cancel queue

I've come across similar threads, but I have yet to find a suitable solution for my specific issue. Situation: Currently, I'm navigating on both the server side and client side simultaneously. This entails that every frontend navigation using ro ...

Messages are not being emitted from the socket

I've been encountering an issue with message transmission from client to server while using React and ExpressJS. When I trigger the sendMessage function on the client side, my intention is to send a message to the server. However, for some reason, the ...

No data found in req.query object in ExpressJS

When I use http.post to send data from Angular to NodeJS, the req.query always comes back empty for me. Here is my server.js setup: const express = require('express'); const cors = require('cors'); const bodyParser = require('body ...

Issue: Unable to locate module ' Stack trace: - /var/runtime/index.mjs when running Lambda function generated using Terraform and Node.js version 18 or higher

My Terraform setup involves a Lambda function with a Node.js version of >= 18, following the steps outlined in this helpful article. However, upon attempting to invoke the Lambda function, CloudWatch throws the following error: "errorType" ...

Having trouble utilizing a custom array of objects in TypeScript and React?

After rendering a Functional Component that retrieves a list of objects, I successfully run a foreach loop with it. However, when I attempt to make http requests with each object to create a new array, something seems off. The formatting appears to be inco ...

I am interested in forming an object using an array and then looping through the keys of that object

I have a custom object with multiple attributes stored in an array. class Test { a1; a2; a3; a4; a5; } In my project, I have an array that always follows the same order as the attributes of the Test object. arrayWithValues = [a1,a2,a3,a4,a5]; To s ...

Error TS2322: Cannot assign type 'Foo | Bar' to type 'Foo & Bar'

I am attempting to save an item in an object using the object key as the discriminator for the type. Refer to the edit below. Below is a simple example: type Foo = { id: 'foo' } type Bar = { id: 'bar' } type Container = { foo ...

Why does the error message "DeprecationWarning: 'originalKeywordKind' deprecated" keep popping up while I'm trying to compile my project?

Upon completing the compilation of my project, I encountered the error message provided below. What does this signify and what steps can I take to resolve it? - info Linting and checking validity of types DeprecationWarning: 'originalKeywordKind' ...

"I am looking for a way to incorporate animation into my Angular application when the data changes. Specifically, I am interested in adding animation effects to

Whenever I click on the left or right button, the data should come with animation. However, it did not work for me. I tried adding some void animation in Angular and placed a trigger on my HTML element. The animation worked when the page was refreshed, bu ...

Version 1.9.3 of Redux Toolkit is encountering an error stating that the 'push' property is not found on the type 'WritableDraft<CartState>'

Currently delving into Redux Toolkit using TypeScript and facing a roadblock that seems deceptively simple. Unfortunately, my current knowledge isn't enough to unravel this puzzle and I'm in need of some guidance. The issue arises with an error ...

When using the Composition API in Vue 3, the "Exclude" TypeScript utility type may result in a prop validation error

Currently, I am utilizing Vue 3 alongside the Composition API and TypeScript, all updated to their latest stable versions. If we take a look at the types below: export interface Person { name: string; } export type Status = Person | 'UNLOADED&ap ...

Retrieve the previous route in Angular 7

I have developed a unique service that allows me to store route changes efficiently. import { Injectable } from '@angular/core'; import { Router, NavigationEnd } from '@angular/router'; @Injectable() export class RouteState { priva ...

Implementing Firebase as an Authentication Middle Layer for Express.js

I am currently working on developing an authentication middleware to verify the presence of a valid firebase token in the request header. Here's the code snippet: auth.ts import * as firebase from 'firebase-admin'; import { NextFunction, Re ...

Testing NestJS Global ModulesExplore how to efficiently use NestJS global

Is it possible to seamlessly include all @Global modules into a TestModule without the need to manually import them like in the main application? Until now, I've had to remember to add each global module to the list of imports for my test: await Tes ...

What could be causing the rapid breakage of the socket in Ionic 3's Bluetooth Serial after just a short period

Although the code appears to be functioning correctly, it loses connection shortly after establishing it. This snippet contains the relevant code: import { Component } from '@angular/core'; import { Platform, NavController, ToastController, Ref ...

How to Alphabetize an Array of Strings Containing Numbers using TypeScript and Angular

I'm working with an array that looks like this: arr = ["100 abc", "ad", "5 star", "orange"]; The goal is to first sort the strings without numbers at the beginning, then sort the strings with numbers added at t ...

Incorporating a JavaScript npm module within a TypeScript webpack application

I am interested in incorporating the cesium-navigation JavaScript package into my project. The package can be installed via npm and node. However, my project utilizes webpack and TypeScript instead of plain JavaScript. Unfortunately, the package is not fou ...