Структура навигации в React Native Typescript для дублирующейся страницы

#typescript #react-native #react-navigation

#typescript #react-native #реакция-навигация

Вопрос:

У меня есть следующая структура навигации в моем файле app.tsx:

 const HomeStack = createStackNavigator<HomeStackParamList>()

function HomeStackScreen() {
  return (
    <HomeStack.Navigator>
      <HomeStack.Screen
        name='Home'
        component={NasaImageList}
        options={{ title: 'NASA Image Search' }}
      />
      <HomeStack.Screen
        name='Details'
        component={NasaImageDetails}
        options={({ route }) => ({ title: route.params.title })}
      />
    </HomeStack.Navigator>
  )
}

const FavouriteStack = createStackNavigator<FavouriteStackParamList>()

function FavouriteStackScreen() {
  return (
    <FavouriteStack.Navigator>
      <FavouriteStack.Screen
        name="Favourites"
        component={NasaImageFavouriteList} />
      <FavouriteStack.Screen
        name="Details"
        component={NasaImageDetails}
        options={({ route }) => ({ title: route.params.title })}} />
    </FavouriteStack.Navigator>
  )
}

const Tab = createBottomTabNavigator()

export default class App extends Component {
  render() {
    return (
      <NavigationContainer>
        <Tab.Navigator>
          <Tab.Screen
            name="Home"
            component={HomeStackScreen}
          />
          <Tab.Screen
            name="Favourites"
            component={FavouriteStackScreen} />
        </Tab.Navigator>
      </NavigationContainer>
    )
  }
  

Параметры маршрута определены в типах HomeStackParamList и Favoritestackparamlist, как указано ниже. На данный момент они те же, но, вероятно, изменятся, поэтому необходимо хранить их отдельно.

 export type HomeStackParamList = {
  Home: undefined
  Details: {
    nasaId: string
    title: string
  }
}

export type FavouriteStackParamList = {
  Favourites: undefined
  Details: {
    nasaId: string
    title: string
  }
}
  

Тип навигационного реквизита, передаваемый в мой компонент NasaImageDetails, который формирует «Детали» компонента экрана, определяется следующим образом:

 export type NasaImageDetailsHomeNavigationProp = StackNavigationProp<
HomeStackParamList,
  'Details'
>

export type NasaImageDetailsFavouriteNavigationProp = StackNavigationProp<
FavouriteStackParamList,
  'Details'
>
  

В итоге я получаю два типа навигационных реквизитов из двух списков параметров, что не идеально. Каковы наилучшие методы для этой ситуации в react native typescript?

Ответ №1:

Не нашел способа обойти это, поэтому вместо этого просто использовал:

 export type NasaImageDetailsHomeNavigationProp = StackNavigationProp<
HomeStackParamList,
  'Details'
> | StackNavigationProp<
FavouriteStackParamList,
  'Details'
>