What is the reason behind RematchDispatch returning a `never` type when a reducer and an effect share the same name?

Recently, I made the switch from TypeScript 4.1.2 to 4.3.2 with Rematch integration. Here are the Rematch packages in use:

  • "@rematch/core": "2.0.1"
  • "@rematch/select": "3.0.1"

After the upgrade, a TypeScript error popped up stating: Type never has no call signatures. Upon investigating the third-party code, I discovered that RematchDispatch returns a never type when both a reducer and an effect within a model share the same name.

For instance:

export const myModel = createModel<RootModel>()({
  state: { ... },
  reducers: {
    myReducer(state, payload: string) { ... }
  },
  effects: dispatch => ({
    myReducer(payload: string, rootState) { ... }
  }
}

The type

RematchDispatch<RootModel>['myModel']['myReducer']
will be 'never', preventing me from using useDispatch in a React component due to the aforementioned TypeScript error.

Consulting the documentation at , I came across this note:

Effects functions that share a name with a reducer are called after their reducer counterpart.

This behavior was functional before the TypeScript update, hinting at a compatibility issue between Rematch and TypeScript.
Could you provide guidance on resolving this error? Any insight into where I may have gone wrong would be greatly appreciated.

Thank you in advance!

Answer №1

Greetings, I go by the name of Sergio and I am responsible for overseeing rematches!

It seems like you have encountered an issue with our typing system. The recent upgrade from TypeScript 4.1 to 4.3 has resulted in some changes in how it handles various scenarios. This required adjustments on the part of the Rematch team.

We are actively addressing this issue through this link: https://github.com/rematch/rematch/issues/912. Additionally, we have implemented a Github Action to test our typings against Typescript@next version, enabling us to rectify any issues before the stable release of TypeScript.

A temporary solution would be to differentiate the names of your effect and reducer, such as using "increment" for the effect and "INCREMENT" in uppercase for the reducers.

Rest assured, we are diligently working towards resolving this matter. Thank you for bringing it to our attention :)

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

CPU usage spikes after launching a Cordova project in Visual Studio 2015 RTM

If you're looking for the source code of the project, you can find it at https://github.com/Yaojian/Ionic-TypeScript-Starter/. I decided to create a Visual Studio project by forking https://github.com/Justin-Credible/Ionic-TypeScript-Starter/ and fol ...

Calculate the difference and sum of time values with varying signs in JavaScript

-12:00 - 5:30 => -6:30 -2:00 - 5:30 => 3:30 00:00 - 5:30 => -5:30 6:00 - 2:30 => 3:30 I am interested in subtracting time with both positive and negative indices. let myCountries = [ { countryName: "NewZealand", ...

What is the best way to bundle a TypeScript package along with its dependencies for seamless integration with various Next.js projects on a local environment

Currently, I am immersed in a project with the following arrangement: / # repository root /core # A local, unpublished npm package used by both projectA and projectB /projectA # A Next.js app /projectB # Another Next.js app In my setup, I gene ...

Ways to prevent the need for explicit undefined checks when passing a string prop to a component in TypeScript

Can the checkVar function be modified to prevent the occurrence of an error message TS2322: Type string | undefined is not assignable to type string? // The TestComponent function takes a parameter fooProp that should be a string. function TestComponent({ ...

Finding the number enclosed within two characters - TypeScript

Recently, I've started exploring Typescript and I'm currently working on creating a webhook within my Google Cloud Functions. In one of the scenarios, I have this string: C1234567890A460450P10TS1596575969702 My objective is to utilize regex to ...

"Here's a comprehensive guide on how to connect dynamic data with angular-tree-grid components

ERROR TypeError: Cannot read property 'map' of undefined Can anyone help with binding dynamic data? I'm currently using angular-tree-grid but struggling to bind dynamic data. <html> <db-angular-tree-grid (expand)= ...

The meaning behind a textual representation as a specific type of data

This snippet is extracted from the file lib.es2015.symbol.wellknown.d.ts interface Promise<T> { readonly [Symbol.toStringTag]: "Promise"; } The concept of readonly seems clear, and the notation [Symbol.toStringTag] likely refers to "'toStr ...

Tips for retrieving JSON files within karma tests

I am currently working on developing a test for my TypeScript class that involves retrieving data from a JSON file. readData<T>(filePath: string): Promise<T> { return Qajax.getJSON(filePath); } For testing purposes, I am utilizing the Jas ...

Clicking the button on an Ionic/Angular ion-item will toggle the visibility of that item, allowing

I'm currently working with Ionic 5 / Angular and I have a collection of ion-item's, each containing a button. Take a look at the code snippet below: <ion-list> <ion-item> <ion-label>One</ion-label> ...

Refresh a doughnut chart in real-time using NG2Charts

Currently, I am in the process of developing a macronutrient calculator as part of a project. The idea is to have a form where users can input values, and a corresponding doughnut chart will display with initial values set at 0. However, upon clicking the ...

In Certain Circumstances, Redirects Are Applicable

I have set up Private Routing in my project. With this configuration, if there is a token stored in the localStorage, users can access private routes. If not, they will be redirected to the /404 page: const token = localStorage.getItem('token'); ...

React Native Async Storage: displaying a blank page issue

I am facing an issue while attempting to save my data locally using AsyncStorage, specifically with the getData method. const storeData = async (value: string) => { //storing data to local storage of the device try { await AsyncStorage.setItem(& ...

Mocking a service dependency in Angular using Jest and Spectator during testing of a different

I am currently using: Angular CLI: 10.2.3 Node: 12.22.1 Everything is working fine with the project build and execution. I am now focusing on adding tests using Jest and Spectator. Specifically, I'm attempting to test a basic service where I can mo ...

What is the method for incorporating a customized button into the header of a Dynamic Dialog using PrimeNG?

I'm currently working on a project using Angular v17 and PrimeNG. I need to add buttons to the header of a dynamic dialog, but I've been struggling to find a solution. Here's the code snippet from my dialog component: show(j): void { ...

Error encountered while attempting to load an image in a React component using TypeScript linting

I am currently working on a React app with Next.js where I have imported an image using the following code: import image1 from '../../../img/dummy-image-2.jpg'; Subsequently, I use the image in my app like so: <img src={image1} alt="Dumm ...

Describe the TypeScript type for an object with constant keys

My query resembles the one found in this Typescript interface definition question, but has a slight variation. I am beginning with an object where the keys are constants: const KEYS = { KEY1: 'hello', KEY2: 'world' } as const; How ...

Utilizing Angular 2 or TypeScript to Retrieve Visitor's Location

I initially began using ServerVariables["HTTP_CF_IPCOUNTRY"] on the backend server, but it's proving to be too slow. I'm looking for an Angular or TypeScript alternative to speed things up. ...

Typescript is facing an issue locating the declaration file

I'm encountering an issue with TypeScript not recognizing my declaration file, even though it exists. Can anyone provide insight into why this might be happening? Here is the structure of my project: scr - main.ts - dec.d.ts str-utils - index. ...

Navigating through a JSON dictionary in Svelte: A step-by-step guide

When working with Svelte, the #each construct allows for easy iteration over array-like objects. But what if you have a JSON dictionary object instead? Is there a way in Svelte to iterate over this type of object in order to populate a dropdown menu? The ...

I'm having difficulty updating the Angular CLI version

I am currently running Angular CLI version 7.1.4 and I have been attempting to update to the latest version. However, each time I try to update, I encounter a multitude of errors. I have attempted using the command ng update @angular/core @angular/cli b ...