Как я должен определить тип реквизита, предоставляемого react-navigation?

#reactjs #typescript #react-native #react-navigation

#reactjs #typescript #react-native #react-navigation

Вопрос:

У меня есть react native приложение с navigation определенным стеком:

  <Stack.Navigator
            initialRouteName={NavigationLocations.SIGNUP}
            ...
            }}>
           ...
            <Stack.Screen
                name={NavigationLocations.SHEET}
                component={Sheet}
                options={
                    {
                        title: "Character sheet",
                        headerLeft: null
                    }}
            />
        </Stack.Navigator>
 

Это мое navigation props определение:

 export type RootStackParamList = {
    Signup: undefined,
    Login: undefined,
    Dashboard: undefined,
    SheetView: {sheet: ISheet}
};
 

Как я должен определить реквизит листа в компоненте, который получает sheet объект, переданный навигацией?

 type Props = StackScreenProps<RootStackParamList, NavigationLocations.SHEET>

export default function Sheet({sheet}: Props) {
    const sheet = props.route.params.sheet;
 

В настоящее время я получаю эту ошибку: Error:(11, 32) TS2339: Property 'sheet' does not exist on type 'StackScreenProps<RootStackParamList, NavigationLocations.SHEET>'.

Я использую NavigationLocations enum, потому что мне обычно не нравится использовать строки в качестве идентификаторов, но я думаю, что моя реализация привела к ошибке здесь. Что я делаю не так?

Ответ №1:

StackScreenProps Просто включает типы для реквизита navigation и route .

 type Props = {
    navigation: StackNavigationProp<RootStackParamList, NavigationLocations.SHEET>;
    route: Route<NavigationLocations.SHEET, {
        ...;
    }>;
}
 

Похоже, вы пытались получить доступ sheet к реквизиту верхнего уровня:

 function Sheet({sheet}: Props) {
 

А также как вложенное свойство:

 const sheet = props.route.params.sheet;
 

Этот второй правильный. Мы можем снять некоторые уровни вложенности, если сделаем это:

 export default function Sheet({ navigation, route }: Props) {
  // sheet has type ISheet
  const {sheet} = route.params;
 

Перечисление не должно быть проблемой, если значение перечисления соответствует ключу в RootStackParamList . Я получаю другую ошибку, когда она не совпадает, так что это не ваша проблема.