I'm confused about how to explicitly type my Drawer Navigator in my TypeScript code.
I can easily get things to behave as I expect, for example, in the following code. In particular the drawer-specific methods (e.g., openDrawer, etc.) all works as they should. But my linter complains that none of those methods are defined with
TS2339: Property 'openDrawer' does not exist on type 'NavigationProp { key: string; index: number; routeNames: never[]; history?: unknown[] | undefined; routes: NavigationRoute []; type: string; stale: false; }>, {}, {}>'.
I can move this problem around with tricks like replacing
 const navigation = useNavigation()
with
 const navigation: Drawer = useNavigation()
but always get some sort of error (here "TS2304: Cannot find name 'Drawer'."). And can eliminate the error by guessing
 const navigation: Drawer.DrawerNavigationProp<any> = useNavigation()
But I've lost track of what is going on there.
What is the correct way to specify that navigation is a navigation drawer (I'm not even sure of the correct type to specify)?
NavigationExample.tsx:
import React, { ReactElement }  from 'react'
import {useNavigation} from "@react-navigation/native"
const NavigationExample = (): ReactElement => {
    const navigation = useNavigation()
    return (
        <View style={ styles.container }>
            <Text style={ styles.testText }>Navigation</Text>
            <Button onPress={ () => navigation.toggleDrawer() } title="Toggle" color="blue" />
            <Button onPress={ () => navigation.openDrawer() } title="Open" color="green" />
            <Button onPress={ () => navigation.closeDrawer() } title="Close" color="red" />
        </View>
    )
}
App.tsx:
import NavigationExample from './components/NavigationExample'
//...
import { createDrawerNavigator } from '@react-navigation/drawer'
import { NavigationContainer } from '@react-navigation/native'
export const Drawer = createDrawerNavigator()
const App = () =>  {
  return (
      <NavigationContainer>
        <Drawer.Navigator>
          <Drawer.Screen name="Navigation" component={ NavigationExample } />
          // ...
        </Drawer.Navigator>
      </NavigationContainer>
  )
}
export default App
I am not sure if this is the 'correct' way to do it but here is how we have used it in some projects:
import { 
  NavigationContainer, 
  useNavigation, 
  NavigationProp, 
  ParamListBase 
} from "@react-navigation/native"
import { 
  createDrawerNavigator, 
  DrawerNavigationProp 
} from "@react-navigation/drawer";
/* ... */
const navigation = useNavigation<DrawerNavigationProp<ParamListBase>>()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With