Реагируйте на навигацию v6 Навигационный контейнер, связывающий атрибут с вложенной навигацией проблема с машинописным текстом

#typescript #react-native #expo #react-navigation

Вопрос:

Я использую react navigation 6 с навигатором корневого стека, содержащим навигатор вкладок. Моя конфигурация атрибута связи выглядит так в компоненте приложения:

 export default function App() {
    const linking = {
        prefixes: [prefix],
        config: {
            screens: {
                Roundups: 'roundups',
                Account: 'account',
                TabNavigator: {
                    screens: {
                        Tab1: 'tab1',
                        Tab2: 'tab2',
                    },
                },
            },
        },
    };

    return (
        <NavigationContainer linking={linking} fallback={<Text>Loading...</Text>}>
            <QueryClientProvider client={queryClient}>
                <Stack.Navigator>
                    <Stack.Screen name="RoundUps" component={RoundUps} />
                    <Stack.Screen name="Account" component={Account} />
                    <Stack.Screen name="LoggedIn" component={TabNavigator} />
                </Stack.Navigator>
            </QueryClientProvider>
        </NavigationContainer>
     );
}
 

Мой компонент TabNavigator выглядит следующим образом:

 const Tab = createBottomTabNavigator();

type Props = NativeStackScreenProps<RootStackParamList, 'TabNavigator'>;

const TabNavigator = ({ navigation }: Props) => {
    return (
        <Tab.Navigator>
            <Tab.Screen name="Tab1" component={Tab1Screen} />
            <Tab.Screen name="Tab2" component={Tab2Screen} />
        </Tab.Navigator>
    );
};

export default TabNavigator;
 

Ссылаясь на навигационные документы react по этому атрибуту, я считаю, что это правильная настройка, но я получаю эту ошибку машинописи, и я в растерянности.

 Type '{ prefixes: string[]; config: { screens: { Roundups: string; Account: string; TabNavigator: { screens: { Tab1: string; Tab2: string; }; }; }; }; }' is not assignable to type 'LinkingOptions<{ Roundups: unknown; Account: unknown; TabNavigator: unknown; }>'.
  The types of 'config.screens.TabNavigator' are incompatible between these types.
    Type '{ screens: { Tab1: string; Tab2: string; }; }' is not assignable to type 'string | Omit<PathConfig<{}>, "screens" | "initialRouteName"> | undefined'.
      Type '{ screens: { Tab1: string; Tab2: string; }; }' has no properties in common with type 'Omit<PathConfig<{}>, "screens" | "initialRouteName">'.ts(2322)
 

Я упускаю здесь что-то очевидное? Спасибо

Ответ №1:

Я тоже столкнулся с этим. Чтобы исправить это, попробуйте аннотировать объект ссылки следующим образом:

 const linking: LinkingOptions<RootStackParamList> = {
  ...
};
 

Затем убедитесь, что RootStackParamList это правильное представление вашей структуры вложенности и параметров:

 type TabsParamList = {
  Tab1: undefined
  Tab2: undefined
}

type RootStackParamList = {
  RoundUps: undefined
  Account: undefined
  LoggedIn: NavigatorScreenParams<TabsParamList>
}