createBottomTabNavigator 中的 navigationOptions 的 propTypes 应该在哪里定义?

Where should propTypes for navigationOptions inside createBottomTabNavigator be defined?

我刚刚应用了 airbnb、prettier、react/prettier 和所有 linting。我仍然无法解决这个错误[1],因为我没有正确理解应该在哪里为 "inner functions" 声明 propTypes 作为这个。

我没有提供这些参数,也没有定义它们。正如我在文档中看到的那样,它们来自 createBottomTabNavigator。那么,我应该如何对 tabBarIcon 需要哪些 props 而哪些不需要 在这些的解构中发表意见?[2]

更新

[1] 该错误是 linting 错误。代码执行得很好。

[2] 我们当然可以 fiddle 让它工作并避免错误,但我的目标是了解它是如何工作的以及为什么它会返回错误,因为 snippet官方例子

export const HomeStackNavigator = createStackNavigator(
    ...
);

export const TabNavigator = createBottomTabNavigator(
  {
    Home: {
      screen: HomeStackNavigator,
    },
    Settings: {
      screen: SettingsStackNavigator,
    },
  },
  {
    initialRouteName: 'Home',
    defaultNavigationOptions: ({ navigation }) => ({
      tabBarIcon: ({ focused, horizontal, tintColor }) => {
        // Getting error here ^^^^^^^^^^^^^^^^^^^^^^^^
        // 'focused' is missing in props validationeslint(react/prop-types)
        const { routeName } = navigation.state;
        let IconComponent = Ionicons;
        let iconName;
        if (routeName === 'Home') {
          iconName = 'ios-home';
          IconComponent = HomeIconWithBadge;
        } else if (routeName === 'Settings') {
          iconName = 'ios-cog';
        }
        return (
          <IconComponent //
            name={iconName}
            color={tintColor}
            size={25}
          />
        );
      },
      headerStyle: {
        backgroundColor: '#f4511e',
      },
      headerTintColor: '#fff',
      headerTitleStyle: {
        fontWeight: 'bold',
      },
    }),
    tabBarOptions: {
      // activeTintColor: 'tomato',
      keyboardHidesTabBar: true,
    },
  }
);

export default class App extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      appState: AppState.currentState,
      isStoreLoading: false,
      store: createStore(rootReducer)
    };
  }

  ...

  componentDidMount(){...}

  ...

  render() {
    const { store, isStoreLoading } = this.state;
    if (isStoreLoading) {
      return <Text>Loading...</Text>;
    }
    return (
      <Provider store={store}>
        <AppContainer />
      </Provider>
    );
  }
}

如果你真的想为这样的内部函数定义 prop-types,你需要将它移到导航器之外。

const MyTabBarIcon = ({ focused, horizontal, tintColor, navigation }) => {
    // [...]
}

MyTabBarIcon.propTypes = {
    focused: PropTypes.bool.isRequired,
    tintColor: PropTypes.string.isRequired,
    navigation: PropTypes.object.isRequired,
    horizontal: PropTypes.bool,
}

然后你的 TabNavigator 变成:

// [...]
defaultNavigationOptions: ({ navigation }) => ({
  tabBarIcon: props => <MyTabBarIcon {...props} navigation={navigation} />,
  // [...]
});
// [...]