diff --git a/types/react-navigation/index.d.ts b/types/react-navigation/index.d.ts index 4e81a26c88..ada96b802f 100644 --- a/types/react-navigation/index.d.ts +++ b/types/react-navigation/index.d.ts @@ -14,7 +14,6 @@ // Steven Miller // Armando Assuncao // Ciaran Liedeman -// Edward Sammut Alessi // Jérémy Magrin // Luca Campana // Ullrich Schaefer @@ -25,6 +24,7 @@ // Denis Frezzato // Mickael Wegerich // Max Davidson +// Alec Hill // Lachlan Young // Jason Killian // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped @@ -1247,7 +1247,7 @@ export type Omit = Pick>; export type InferProps> = T extends React.ComponentType ? P : never; export interface NavigationInjectedProps

{ - navigation: NavigationScreenProp; + navigation: NavigationScreenProp, P>; } // If the wrapped component is a class, we can get a ref to it diff --git a/types/react-navigation/react-navigation-tests.tsx b/types/react-navigation/react-navigation-tests.tsx index 66bcf13c3c..116ae92c56 100644 --- a/types/react-navigation/react-navigation-tests.tsx +++ b/types/react-navigation/react-navigation-tests.tsx @@ -17,12 +17,14 @@ import { NavigationNavigateAction, NavigationProp, NavigationResetAction, + NavigationRoute, NavigationRouteConfigMap, NavigationScreenProp, NavigationScreenProps, NavigationSetParamsAction, NavigationStackAction, NavigationStackScreenOptions, + NavigationStateRoute, NavigationTabScreenOptions, NavigationTransitionProps, StackViewTransitionConfigs, @@ -70,10 +72,22 @@ interface StartScreenNavigationParams { */ class StartScreen extends React.Component> { render() { - // Implicit type checks. + // Injected type checks + const props: NavigationInjectedProps = this.props; + // route state... + const navigationState: NavigationRoute = this.props.navigation.state; + const index: number = navigationState.index; + const key: string = navigationState.key; + const routeName: string = navigationState.routeName; + const path: string | undefined = navigationState.path; + let routes: NavigationRoute[]; + if (isNavigationStateRoute(navigationState)) { + routes = navigationState.routes; + } + // params... const navigationStateParams: StartScreenNavigationParams | undefined = this.props.navigation.state.params; - const id = this.props.navigation.state.params && this.props.navigation.state.params.id; - const s = this.props.navigation.state.params && this.props.navigation.state.params.s; + const id: number | undefined = this.props.navigation.state.params && this.props.navigation.state.params.id; + const s: string | undefined = this.props.navigation.state.params && this.props.navigation.state.params.s; return ( @@ -107,17 +121,32 @@ interface NextScreenNavigationParams { class NextScreen extends React.Component> { render() { - // Implicit type checks. - const navigationStateParams: NextScreenNavigationParams | undefined = this.props.navigation.state.params; + // Injected type checks + const props: NavigationInjectedProps = this.props; + // route state... + const navigationState: NavigationRoute = this.props.navigation.state; + const index: number = navigationState.index; + const key: string = navigationState.key; + const routeName: string = navigationState.routeName; + const path: string | undefined = navigationState.path; + let routes: NavigationRoute[]; + if (isNavigationStateRoute(navigationState)) { + routes = navigationState.routes; + } + // params... + const navigationStateParams: NextScreenNavigationParams | undefined = navigationState.params; const id = this.props.navigation.state.params && this.props.navigation.state.params.id; const name = this.props.navigation.getParam('name', 'Peter'); - return ( ); } } +function isNavigationStateRoute

(route: NavigationRoute

): route is NavigationStateRoute

{ + return !!(route as NavigationStateRoute

).routes; +} + const navigationOptions = { headerBackTitle: null, };