What is the correct way to define the arguments of a function that receives a union type parameter?

Imagine having a union type structured like this:

type State = {
  value: number
  things: []
}

type Action =
  | {
      type: 'INCREMENT'
      data: number
    }
  | {
      type: 'DECREMENT'
      data: number
    }
  | {
      type: 'DO_THING'
      data: {
        id: string
        name: string
      }
    }

Now, picture having a reducer function written in this way:

function reducer(state: State, action: Action): State {
  switch (action.type) {
    case 'INCREMENT':
      return increment(state, action)
    case 'DECREMENT':
      return decrement(state, action)
    case 'DO_THING':
      return addItem(state, action)
    default:
      return state
  }
}

While defining my action helper functions, an error pops up. For instance:

function increment(state: State, action: action): State {
  return {
    ...state,
    number: action.data + 1 // this is the culprit
  }
}

The error stems from the union type where data can be either number or the specified object. The error message reads:

Type 'number | { id: string; value: string }' is not assignable to type 'number'

I grasp why the error occurs since value is strictly defined as just number. But... how can I resolve this issue? What steps should I take to properly type everything for smooth operation?

Answer №1

To retrieve the Increment action based on its type, you have the option to utilize the Extract utility.

function updateCounter(state: State, action: Extract<Action, { type: 'INCREMENT' }>): State {
  return {
    ...state,
    value: action.data + 1,
  };
}

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

Problem with Anular5 - "this" not functioning correctly inside of ready()

I am encountering an issue in graph.component.ts this.cContainer = cytoscape ( { ready: function(e) { this._dataService.setResultData(); } }); However, I am getting the following error message: ERROR TypeError: Cannot read property &ap ...

Exploring the power of NestJS integration with Mongoose and GridFS

I am exploring the functionality of using mongoose with NestJs. Currently, I am leveraging the package @nestjs/mongoose as outlined in the informative documentation. So far, it has been functioning properly when working with standard models. However, my p ...

The message "Missing property 'type' in type 'typeof WithXXX'" indicates an error

Currently, I am working on a project using React in combination with Typescript. My goal is to create a higher order component based on the react-dnd library. The problem arises within the DragSource section of the react-dnd component. Here is the relevant ...

Uncovering the websocket URL with NestJS and conducting postman tests: A step-by-step guide

Creating a mean stack application using NestJS involves utilizing websockets. However, testing websockets in Postman can be confusing. Typically, I test route URLs in Postman and get output like: "http://localhost:3000/{routeUrl}". But when it comes to tes ...

I found that the Angular checkbox was only allowing me to select one value at a time instead of

Hey there, I am currently working on an angular tickbox where I want to be able to tick multiple values. However, I am facing an issue where only the latest checkbox value is displayed instead of both English and German together. How can I populate data fr ...

Using array.map() in JavaScript returns an array instead of an object

JavaScript is still new to me and I'm struggling with mapping an array. I'm not sure how to return an array with objects. Here is the original array: array1 = [{firstName: "Harry"}, {lastName: "Potter"}]; After using array1.map, it c ...

When attempting to utilize the dispatch function in a class-based component, an invalid hook call error may

I am a beginner with react-redux. I currently have this code that uses react, redux, and TypeScript. The code utilizes a class-based component and I am attempting to use dispatch to trigger an action to increment the value of counter. However, I encountere ...

In TypeScript and React, what is the appropriate type to retrieve the ID of a div when clicked?

I am facing an issue in finding the appropriate type for the onClick event that will help me retrieve the id of the clicked div. const getColor = (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => { const color = event.target.id; // ...

Exploring Typescript: Understanding the nuances of importing and exporting values or references

Currently, I am facing a challenge while converting Javascript code to Typescript, specifically with regards to import and export functionality: Intended Functionality: I aim to import 'POST_Requirements' into multiple other files. Each file tha ...

How to Guarantee NSwag & Extension Code is Positioned at the Beginning of the File

In my project, I am using an ASP.Net Core 3.1 backend and a Typescript 3.8 front end. I have been trying to configure NSwag to include authorization headers by following the guidelines provided in this documentation: https://github.com/RicoSuter/NSwag/wik ...

Navigating through Angular using Typescript can sometimes lead to uncertainty when working with return data. This is where the

How do you handle a request with uncertain data and type checking? For instance, if you are making an HTTP call to an API where various data can be returned, but your component requires a specific data structure defined by an interface. Here's a sim ...

What steps can be taken to fix a Node.js startup issue with New Relic caused by an error message stating: "Error: Failed to establish a connection

Recently, I cloned a fully functional repository. This project is in Typescript and I am now working on adding some unit tests using mocha. However, upon running the project, an error related to NewRelic pops up: PS C:\Users\ENV\Projects ...

"Ensure Playwright refreshes the page automatically following navigation when a specific status code is

I find myself in a dilemma where I require my functional browser tests to verify the status code of each page response, and if a 503 error is encountered, try to reload the page a certain number of times before declaring failure. Even though I have experi ...

My function executes smoothly when I pass a reference to an object, but it encounters an error when I include extra properties in the object and pass it as a value

In my coding project, there is a function called sayMyName that takes an argument of type User When I pass a user as reference, everything works perfectly: interface User{ firstName:string; lastName:string; } function sayMyName(user:User){ console. ...

Service Activation Button Click Event

When coding, I designated the path as follows: { path:'home', component: homeComponent; } In app.component.html: <button (click)="routerLink='/home'" An error occurred here Are you trying to navigate to the home page by ...

Having trouble loading JSON file contents into an array in Typescript

I am struggling to load my API keys from a JSON file named api.json. The file structure is as follows: { "service1": ["apikey1", "apikey2"], "service2": ["apikey1", "apikey2"] } In order to manag ...

Passing NextJS props as undefined can lead to unexpected behavior and

Struggling with dynamically passing props to output different photo galleries on various pages. One of the three props works fine, while the others are undefined and trigger a warning about an array with more than one element being passed to a title elemen ...

Objects That Are Interconnected in Typescript

I have been delving into TS and Angular. I initially attempted to update my parent component array with an EventEmitter call. However, I later realized that this was unnecessary because my parent array is linked to my component variables (or so I believe, ...

Refine specific unions by considering past values that have been used

Here's the scenario at hand: type Option = 'x' | 'y' | 'z' | 'w' type Inquiry = { query: string; choices: Option[]; defaultChoice: Option // here's where it gets tricky } I am looking to set the def ...

Adjusting Image Sizes in React using Material-UI: A Guide to Automatically Resizing Images for Various Screen Dimensions

Having trouble making images within my React project responsive across different screen sizes. Using Material-UI, I currently set the maxWidth property with a percentage value which doesn't give me the desired outcome. Seeking advice on a more dynamic ...