'Using Functional React Native Components && Typescript with navigation and dynamically changing title

I am learning React Native and attempting to use Typescript in my project to keep it clean for me.

I'm stuck on basic navigation.

I defined a parent screen using a functional component like this:

interface Props extends NavigationStackScreenProps {
  // ... other props
}

const InventoryScreen: NavigationStackScreenComponent<Props> = ({navigation/* destructured props */}) => {

  // ... other logic here

  return (
    <View style={styles.screen}>
      <Text>The Inventory Screen!</Text>
      <FlatList 
          data={SEEDS} 
          keyExtractor={(item, index) => item.seedId}
          renderItem={renderGridItem} 
          numColumns={1} 
      />

      <Button title="Go to Seeds" onPress={() =>{
        navigation.navigate('Seed');
      }}/>
    </View>
  );
}

// Properties
InventoryScreen.navigationOptions = {
  headerTitle: 'My Seeds',
  headerStyle: {
    backgroundColor: Colors.primaryColor,
  },
  headerTintColor: 'white',
};

Then I define a child screen in a similar way - but this is the screen I want to change when it is entered... interface

interface Props extends NavigationStackScreenProps {
  // ... other props
  seed: Seed,
}

const SeedScreen: NavigationStackScreenComponent<Props> = ({navigation}) => {
  const seed = navigation.getParam('seed');
  
  return (
    <View style={styles.screen}>
      <Text>The Seed Screen!</Text>
      <Text>{seed.seedId}</Text>
    </View>
  );
  
}

// Properties
SeedScreen.navigationOptions = (navigationData) => {
  console.log(navigationData);
};

I want to set the title in navigationOptions, but this way will not allow me to assign a function as an object. I get this error:

Type '(navigationData: NavigationScreenConfigProps<StackNavigationProp<NavigationRoute<NavigationParams>, Props>, unknown> & { ...; }) => void' is not assignable to type 'NavigationScreenConfig<StackNavigationOptions, StackNavigationProp<NavigationRoute<NavigationParams>, Props>, unknown> | undefined'.
  Type '(navigationData: NavigationScreenConfigProps<StackNavigationProp<NavigationRoute<NavigationParams>, Props>, unknown> & { ...; }) => void' is not assignable to type '(navigationOptionsContainer: NavigationScreenConfigProps<StackNavigationProp<NavigationRoute<NavigationParams>, Props>, unknown> & { ...; }) => StackNavigationOptions'.

25 SeedScreen.navigationOptions = (navigationData) => {

And

Type '{ ({

 navigation }: PropsWithChildren<NavigationStackScreenProps<Props, unknown>>): Element; navigationOptions(navigationData: NavigationScreenConfigProps<StackNavigationProp<NavigationRoute<NavigationParams>, Props>, unknown> & { ...; }): void; }' is not assignable to type 'NavigationStackScreenComponent<Props, unknown>'.
  Type '{ ({ navigation }: PropsWithChildren<NavigationStackScreenProps<Props, unknown>>): Element; navigationOptions(navigationData: NavigationScreenConfigProps<StackNavigationProp<NavigationRoute<NavigationParams>, Props>, unknown> & { ...; }): void; }' is not assignable to type 'FunctionComponent<NavigationStackScreenProps<Props, unknown>> & { navigationOptions?: NavigationScreenConfig<StackNavigationOptions, StackNavigationProp<...>, unknown> | undefined; }'.
    Type '{ ({ navigation }: PropsWithChildren<NavigationStackScreenProps<Props, unknown>>): Element; navigationOptions(navigationData: NavigationScreenConfigProps<StackNavigationProp<NavigationRoute<NavigationParams>, Props>, unknown> & { ...; }): 
void; }' is not assignable to type '{ navigationOptions?: NavigationScreenConfig<StackNavigationOptions, StackNavigationProp<NavigationRoute<NavigationParams>, Props>, unknown> | undefined; }'.
      Types of property 'navigationOptions' are incompatible.
        Type '(navigationData: NavigationScreenConfigProps<StackNavigationProp<NavigationRoute<NavigationParams>, Props>, unknown> & { ...; }) => void' is not assignable to type 'NavigationScreenConfig<StackNavigationOptions, StackNavigationProp<NavigationRoute<NavigationParams>, Props>, unknown> | undefined'.
          Type '(navigationData: NavigationScreenConfigProps<StackNavigationProp<NavigationRoute<NavigationParams>, Props>, unknown> & { ...; }) => void' is not assignable to type '(navigationOptionsContainer: NavigationScreenConfigProps<StackNavigationProp<NavigationRoute<NavigationParams>, Props>, unknown> & { ...; }) => StackNavigationOptions'.
            Type 'void' is not assignable to type 'StackNavigationOptions'.        
              Type 'void' is not assignable to type 'StackHeaderOptions'.

12 const SeedScreen: NavigationStackScreenComponent<Props> = ({navigation/* destructured props */}) => {

And the actual navigator class functions but also throws errors that it doesn't like the screens types.

There are so many layers of generics here I'm having a hard time deciphering this error.

Can you help me fix there error or point to an example of this working?

Or does this sound like a bug here https://github.com/react-navigation/react-navigation/issues/6516



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source