-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Open
Labels
Description
I have a codebase using legacy redux patterns and trying to slowly but steadily transition to using modern redux. I have a set of old Actions that are created similiar to ExtraAction
mentioned below. When using the listenerMiddleware
to add a set of type guards as matchers using the isAnyOf
utility as demonstrated below, I see a type error on the matcher.
Also, it seems as the type inferred from the predicate (probably the matcher to) doesn't carry along into effect callback.
interface ExtraAction extends Action {
payload: number
}
function isPayloadAction(action: any): action is ExtraAction {
return (
isFluxStandardAction(action) && typeof action.payload === 'number'
)
}
startListening({
matcher: isAnyOf(isPayloadAction),
effect: (action, listenerApi) => {
expectTypeOf(action).toMatchTypeOf<ExtraAction>()
},
})
Metadata
Metadata
Assignees
Labels
Type
Projects
Milestone
Relationships
Development
Select code repository
Activity
EskiMojo14 commentedon Sep 24, 2024
predicate
isn't used as a type guard, onlymatcher
is.Could you post what the type error you're getting is?
#3862 is also likely related.
antondalgren commentedon Sep 24, 2024
Thank you for the swift response.
Here is the ts-error:
This does provide
action
with the correct type, thus using a type guard as predicate should carry along the correct type, shouldn't it? 🤔markerikson commentedon Sep 24, 2024
No,
predicate
explicitly does not narrow the action type. It's a very generic(action, prevState, nextState) => boolean
callback that could have any logic inside, and so it can't guarantee the type ofaction
.[-]`listenerMiddleware` type error in matcher and predicate using custom actions.[/-][+]`listenerMiddleware` type error in matcher using custom actions.[/+]antondalgren commentedon Oct 30, 2024
OK. The explanation of the issue still holds for matchers. Any suggestions on how I could fix this in either a PR or a workaround in my codebase?
EskiMojo14 commentedon Oct 30, 2024
have you checked out the issue i linked, and tried moving the
isAnyOf
call to a separate variable like the replies to that issue recommend?antondalgren commentedon Nov 15, 2024
Yes, just tried and that didn't help. It works as expected when using RTK defined actions such as below. But not when using custom built matcher functions.
EskiMojo14 commentedon Nov 15, 2024
Could you put together a reproduction of this, either in Typescript Playground or a repo i can checkout?
antondalgren commentedon Nov 15, 2024
Sure, here is a commit adding a testcase in a fork of this repo. Hope this is clear enough, otherwise let me know and I'll try to adjust!
antondalgren@de72aac
EskiMojo14 commentedon Nov 15, 2024
ok, that helped a little - it still won't work inline because of the TS bug mentioned previously, but i found a change that fixes it when the predicate is defined outside.
Switching from UnknownAction to Action works:
Presumably this is because any

interface
is missing the index signature UnknownAction has. you can verify this by switching ExtraAction to atype
instead and the error disappears:This is briefly covered in this article by Matt Pocock.
antondalgren commentedon Nov 21, 2024
Oh, so the preferred way of declaring actions in a legacy type of application would be to use
type
instead ofinterface
? Well, today I learned something new. Thank you for taking the time to look through this issue @EskiMojo14 !