I'm having some diffuculties specifing the parameters for a function (onError) that receive the return of a useNavigation())
import { BottomTabScreenProps } from '@react-navigation/bottom-tabs'
import { CompositeScreenProps, NavigatorScreenParams, useNavigation } from '@react-navigation/native'
import { NativeStackNavigationProp, NativeStackScreenProps } from '@react-navigation/native-stack'
import { AxiosError } from 'axios'
declare global {
namespace ReactNavigation {
interface RootParamList extends RootStackParamList {}
}
}
export type RootStackParamList = {
SignIn: undefined
ResetPassword: { email: string }
Tabs: NavigatorScreenParams<TabsParamList> | undefined
Modal: undefined
Error: { error: AxiosError | string } | undefined
}
export type TabsParamList = {
Overview: NavigatorScreenParams<OverviewParamList> | undefined
Allocation: undefined
Menu: NavigatorScreenParams<MenuParamList> | undefined
}
export type OverviewParamList = {
OverviewRoot: undefined
Deposit: undefined
}
export type MenuParamList = {
MenuRoot: undefined
UserProfile: undefined
// other settings
}
export type RouteName = keyof RootStackParamList | keyof OverviewParamList | keyof TabsParamList | keyof MenuParamList
export const routeTypeGuard = (route: RouteName) => route as keyof RootStackParamList
export type RootStackScreenProps<Screen extends keyof RootStackParamList> = NativeStackScreenProps<
RootStackParamList,
Screen
>
export type RootTabScreenProps<Screen extends keyof TabsParamList> = CompositeScreenProps<
BottomTabScreenProps<TabsParamList, Screen>,
NativeStackScreenProps<RootStackParamList>
>
export function useErrorHandling() {
const navigation = useNavigation()
// navigation.replace() // this throws a type error - which seems right
return { one rror: (error: unknown) => one rror(navigation, error) } // how to avoid this to throw an error ??
}
export function one rror(
nav: ReturnType<typeof useNavigation<NativeStackNavigationProp<RootStackParamList>>>,
error: unknown
) {
// nav.replace // does not throw type error, but experienced it to make the app crash because nav.replace was undefined
nav.navigate('Error', { error: error instanceof Error ? error.message : 'Unknow error' })
}
CodePudding user response:
Although this might not be the complete answer, here's a workaround to avoid the error:
const navigation = useNavigation<NativeStackNavigationProp<any>>()
CodePudding user response:
I have not personally worked with @react-navigation, so I'm going by the types only, but it looks like useNavigation, when called without type parameters, defaults to ReactNavigation.RootParamList which doesn't match your RootStackParamList.
If you specify type parameters RootStackParamList and keyof RootStackParamList to useNavigation, it type checks correctly:
export function useErrorHandling() {
const navigation =
useNavigation<NativeStackNavigationProp<RootStackParamList, keyof RootStackParamList>>()
return { one rror: (error: unknown) => one rror(navigation, error) }
}
Additionally, you could simplify the nav argument type for onError a little bit by using NativeStackNavigationProp<RootStackParamList, keyof RootStackParamList> instead of the ReturnType application:
export function one rror(
nav: NativeStackNavigationProp<RootStackParamList, keyof RootStackParamList>,
error: unknown
) {
nav.navigate('Error', { error: error instanceof Error ? error.message : 'Unknow error' })
}
