Is there a way to combine two arrays of objects that may be undefined?

Here is the object I am working with:

interface Cart {
    orderPromo?: ProductPromotion[],
    productPromo?: ProductPromotion[],
}

Both properties are of the same type, but they can be undefined. What is the most efficient and clean way to merge them?

I initially attempted the following:

const promotions: ProductPromotion[] = [...cart.orderPromo, ...cart.productPromo];

However, this code resulted in an error message:

TS2488: Type 'ProductPromotion[] | undefined' must have a '[Symbol.iterator]()' method that returns an iterator. 

Answer №1

When it comes to optional properties, the value of cart.orderPromo can either be an array of ProductPromotion or undefined (as per the error message). In the scenario where it turns out to be undefined, using the spread operator ...cart.orderPromo is not feasible.

To handle this situation, it is recommended to convert these properties to empty arrays if they happen to be undefined. This can easily be achieved with the help of the null coalescing operator ??:

const promotions: ProductPromotion[] = [...cart.orderPromo ?? [], ...cart.productPromo ?? []];

Answer №2

The issue at hand is the uncertainty of whether cart.orderPromo or cart.productPromo is undefined in the TypeScript code. To address this, it is recommended to check for their existence before attempting to merge them. Utilizing optional chaining operator ?. allows for safe property access, and the Nullish Coalescing operator ?? can be used to assign a default empty array if needed.

Here's an example:

const promotions: ProductPromotion[] = [
  ...(cart.orderPromo ?? []),
  ...(cart.productPromo ?? [])
];

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

Trouble with using the date pipe in Angular specifically for the KHMER language

<span>{{ value | date: 'E, dd/MM/yyyy':undefined:languageCode }}</span> I am facing a challenge where I need to identify the specific locale code for the KHMER language used in Cambodia. Despite trying various cod ...

What is the best way to check for duplicate email input when using knex?

Currently, I am in the process of developing an application using node.js, knex.js, typescript, zod, and fastify. My main focus is on validating emails during user registration. If a duplicate email is inserted, I want the system to throw a 401 (conflict) ...

Enhancing many-to-many relationships with additional fields in Objection.js

I have a question that I haven't been able to find a clear answer to in the objection.js documentation. In my scenario, I have two Models: export class Language extends BaseId { name: string; static tableName = 'Languages'; st ...

Tips for utilizing ngIf based on the value of a variable

Here is the code from my file.html: <button ion-button item-right> <ion-icon name="md-add-circle" (click)="save();"></ion-icon> </button> The content of file.ts is: editmode = false; I am trying to achieve the foll ...

Retrieving information from Next.js and Typescript with the help of getStaticProps

I've been working on a personal project with Next.js and TypeScript. I'm attempting to fetch data from an API and then map the items, but I'm running into issues. When I use console.log, it returns undefined. The file is located in the pages ...

TSLint flagging a parsing issue in type guard while TypeScript compiler fails to pick up on any errors

I am facing an issue with my TypeScript method that includes a type guard: export function isArray(item: any): item is Array<any> { return item.constructor === Array; } After running tslint on the file, I encountered the following error message ...

Utilize TypeScript interface containing properties of type [foo]

Currently, I am in the process of incorporating the nanostore ReadableAtom interface into my codebase. This interface introduces two distinct properties that may seem unconventional: export interface ReadableAtom<Value = any> { ... readonly [act ...

Why isn't Nodemon monitoring the directory in webpack-typescript-node.js?

Here are the contents of the package.json file for a TypeScript project using webpack and node.js: "scripts": { "build": "webpack", "dev:start": "nodemon --watch src --exec \"node -r dotenv/co ...

Exploring the process of navigating between pages in Next.js using react-router-dom

Whenever a successful login occurs, I want to redirect the user to a different page. However, I am encountering an error message: https://i.sstatic.net/Wi8XW.png This is the snippet of code that is causing the issue: export default function SignUp() { ...

Using Karma-Jasmine to Import Spy without anyImplicitAny

If I include the configuration setting noImplicitAny in the tsconfig.json file of my Angular 4+ project: "noImplicitAny": true, ...and then try to import and use Spy in a unit test: import { Spy } from "karma-jasmine"; I encounter this console error wh ...

Accessing properties in TypeScript using an index that is determined by another property within the same interface

Allow me to illustrate my query with an example rather than simply using words: interface Y { x: number, y: string } interface PairValue<T> { key: keyof T, value: T[this['key']] } const pairValue: PairValue<Y> = { ...

Applying Type Constraints in Typescript Arrays Based on Other Values

Uncertain about how to phrase this inquiry. I have a specific situation where an object is involved. Key1 represents the name, while key2 stands for options. The type of options is determined by the value of the name. The existing solution works fine than ...

Why does VSCode open a React app in Edge instead of Chrome?

Recently, I began a new project using the react-create-app template with typescript. However, when I run npm run dev, it unexpectedly opens in the Edge browser instead of Chrome. Does anyone know how to make it open in Chrome instead? ...

Does Angular 1.3.x have a corresponding .d.ts file available?

Is there a .d.ts file available for Angular 1.3.x to assist in transitioning an app to Typescript 2.0? ...

What is the solution to resolving a Typescript error within an imported library?

I've encountered a Typescript error that I'm unable to resolve because it doesn't originate from my code. The issue arises when I import a NextJs/React module named next-seo and use it as instructed: <NextSeo config={seoConfig} /> The ...

Having difficulty transferring types to and from a custom module?

I'm currently faced with an issue while working on a typescript module within a larger monorepo. I am having difficulty importing types from one package into another via node modules. The types are located at ./types, and my package.json contains a ke ...

Transform a protractor screenshot into a PDF file

I'm currently working on a small Protractor code that captures screenshots, but my goal is to save these screenshots as PDF files. Below you can find the code snippet I have written. await browser.get(url); const img = await browser.takeScreenshot(); ...

How can we avoid excessive re-rendering of a child component in React when making changes to the parent's state?

In my React application, I am facing a situation where a parent component controls a state variable and sends it to a child component. The child component utilizes this state in its useEffect hook and at times modifies the parent's state. As a result, ...

Encountered an issue when attempting to include a model in sequelize-typescript

I've been attempting to incorporate a model using sequelize-typescript: type AppMetaDataAttributes = { id: string; name: string; version: string; createdAt: string; updatedAt: string; }; type AppMetaDataCreationAttributes = Optional<App ...

How to use multiple template urls in Angular 6

Currently, I am creating a front-end using Angular 6 and facing the challenge of having components with varying html structures based on the user who is logged in. The number of templates required can range from 2 to over 20, so my preference would be to ...