From 33476b9cb5e0298a4a03300c4dd3e6072e338983 Mon Sep 17 00:00:00 2001 From: Satyajit Sahoo Date: Mon, 15 Jun 2020 18:12:08 +0200 Subject: [PATCH] refactor: tweak type for screen options --- packages/core/src/SceneView.tsx | 4 +- packages/core/src/Screen.tsx | 2 +- packages/core/src/createNavigatorFactory.tsx | 2 +- packages/core/src/types.tsx | 42 ++++++-------------- packages/core/src/useDescriptors.tsx | 10 +++-- packages/core/src/useNavigationBuilder.tsx | 4 +- packages/core/src/useNavigationCache.tsx | 4 +- 7 files changed, 27 insertions(+), 41 deletions(-) diff --git a/packages/core/src/SceneView.tsx b/packages/core/src/SceneView.tsx index 2d7c527c..6161168f 100644 --- a/packages/core/src/SceneView.tsx +++ b/packages/core/src/SceneView.tsx @@ -15,7 +15,7 @@ import { NavigationProp, RouteConfig, EventMapBase } from './types'; type Props< State extends NavigationState, - ScreenOptions extends object, + ScreenOptions extends {}, EventMap extends EventMapBase > = { screen: RouteConfig; @@ -34,7 +34,7 @@ type Props< */ export default function SceneView< State extends NavigationState, - ScreenOptions extends object, + ScreenOptions extends {}, EventMap extends EventMapBase >({ screen, diff --git a/packages/core/src/Screen.tsx b/packages/core/src/Screen.tsx index c15e0a02..095322f9 100644 --- a/packages/core/src/Screen.tsx +++ b/packages/core/src/Screen.tsx @@ -8,7 +8,7 @@ export default function Screen< ParamList extends ParamListBase, RouteName extends keyof ParamList, State extends NavigationState, - ScreenOptions extends object, + ScreenOptions extends {}, EventMap extends EventMapBase >(_: RouteConfig) { /* istanbul ignore next */ diff --git a/packages/core/src/createNavigatorFactory.tsx b/packages/core/src/createNavigatorFactory.tsx index 26002cd0..19deb600 100644 --- a/packages/core/src/createNavigatorFactory.tsx +++ b/packages/core/src/createNavigatorFactory.tsx @@ -12,7 +12,7 @@ import { TypedNavigator, EventMapBase } from './types'; */ export default function createNavigatorFactory< State extends NavigationState, - ScreenOptions extends object, + ScreenOptions extends {}, EventMap extends EventMapBase, NavigatorComponent extends React.ComponentType >(Navigator: NavigatorComponent) { diff --git a/packages/core/src/types.tsx b/packages/core/src/types.tsx index bf373edd..2e7747b6 100644 --- a/packages/core/src/types.tsx +++ b/packages/core/src/types.tsx @@ -10,7 +10,7 @@ import { } from '@react-navigation/routers'; export type DefaultNavigatorOptions< - ScreenOptions extends object + ScreenOptions extends {} > = DefaultRouterOptions & { /** * Children React Elements to extract the route configuration from. @@ -37,7 +37,6 @@ export type EventMapCore = { focus: { data: undefined }; blur: { data: undefined }; state: { data: { state: State } }; - options: { data: { options: object } }; }; export type EventArg< @@ -251,7 +250,7 @@ export type NavigationProp< ParamList extends ParamListBase, RouteName extends keyof ParamList = string, State extends NavigationState = NavigationState, - ScreenOptions extends object = {}, + ScreenOptions extends {} = {}, EventMap extends EventMapBase = {} > = NavigationHelpersCommon & { /** @@ -322,7 +321,7 @@ export type Descriptor< ParamList extends ParamListBase, RouteName extends keyof ParamList = string, State extends NavigationState = NavigationState, - ScreenOptions extends object = {}, + ScreenOptions extends {} = {}, EventMap extends EventMapBase = {} > = { /** @@ -361,7 +360,7 @@ export type RouteConfig< ParamList extends ParamListBase, RouteName extends keyof ParamList, State extends NavigationState, - ScreenOptions extends object, + ScreenOptions extends {}, EventMap extends EventMapBase > = { /** @@ -471,7 +470,7 @@ export type NavigationContainerRef = NavigationHelpers & export type TypedNavigator< ParamList extends ParamListBase, State extends NavigationState, - ScreenOptions extends object, + ScreenOptions extends {}, EventMap extends EventMapBase, Navigator extends React.ComponentType > = { @@ -479,29 +478,14 @@ export type TypedNavigator< * Navigator component which manages the child screens. */ Navigator: React.ComponentType< - Omit< - React.ComponentProps, - 'initialRouteName' | 'screenOptions' - > & { - /** - * Name of the route to focus by on initial render. - * If not specified, usually the first route is used. - */ - initialRouteName?: keyof ParamList; - /** - * Default options for all screens under this navigator. - */ - screenOptions?: - | ScreenOptions - | ((props: { - route: RouteProp; - navigation: any; - }) => ScreenOptions); - /** - * Configuration for screens - */ - children: React.ReactNode; - } + Omit, keyof DefaultNavigatorOptions> & + Omit, 'initialRouteName'> & { + /** + * Name of the route to focus by on initial render. + * If not specified, usually the first route is used. + */ + initialRouteName?: keyof ParamList; + } >; /** * Component used for specifying route configuration. diff --git a/packages/core/src/useDescriptors.tsx b/packages/core/src/useDescriptors.tsx index fbefeb82..dd889339 100644 --- a/packages/core/src/useDescriptors.tsx +++ b/packages/core/src/useDescriptors.tsx @@ -25,7 +25,7 @@ import NavigationRouteContext from './NavigationRouteContext'; type Options< State extends NavigationState, - ScreenOptions extends object, + ScreenOptions extends {}, EventMap extends EventMapBase > = { state: State; @@ -64,7 +64,7 @@ type Options< */ export default function useDescriptors< State extends NavigationState, - ScreenOptions extends object, + ScreenOptions extends {}, EventMap extends EventMapBase >({ state, @@ -128,7 +128,8 @@ export default function useDescriptors< // The default `screenOptions` passed to the navigator ...(typeof screenOptions === 'object' || screenOptions == null ? screenOptions - : screenOptions({ + : // @ts-ignore: this is a function, but typescript doesn't think so + screenOptions({ // @ts-ignore route, navigation, @@ -136,7 +137,8 @@ export default function useDescriptors< // The `options` prop passed to `Screen` elements ...(typeof screen.options === 'object' || screen.options == null ? screen.options - : screen.options({ + : // @ts-ignore: this is a function, but typescript doesn't think so + screen.options({ // @ts-ignore route, // @ts-ignore diff --git a/packages/core/src/useNavigationBuilder.tsx b/packages/core/src/useNavigationBuilder.tsx index d10c947f..7c98972f 100644 --- a/packages/core/src/useNavigationBuilder.tsx +++ b/packages/core/src/useNavigationBuilder.tsx @@ -56,7 +56,7 @@ type NavigatorRoute = { */ const getRouteConfigsFromChildren = < State extends NavigationState, - ScreenOptions extends object, + ScreenOptions extends {}, EventMap extends EventMapBase >( children: React.ReactNode @@ -160,7 +160,7 @@ const getRouteConfigsFromChildren = < export default function useNavigationBuilder< State extends NavigationState, RouterOptions extends DefaultRouterOptions, - ScreenOptions extends object, + ScreenOptions extends {}, EventMap extends Record >( createRouter: RouterFactory, diff --git a/packages/core/src/useNavigationCache.tsx b/packages/core/src/useNavigationCache.tsx index 41364d29..882ec009 100644 --- a/packages/core/src/useNavigationCache.tsx +++ b/packages/core/src/useNavigationCache.tsx @@ -24,7 +24,7 @@ type Options = { type NavigationCache< State extends NavigationState, - ScreenOptions extends object + ScreenOptions extends {} > = { [key: string]: NavigationProp; }; @@ -36,7 +36,7 @@ type NavigationCache< */ export default function useNavigationCache< State extends NavigationState, - ScreenOptions extends object + ScreenOptions extends {} >({ state, getState,