反应导航 route.params 打字稿

Posted

技术标签:

【中文标题】反应导航 route.params 打字稿【英文标题】:React Navigation route.params typescript 【发布时间】:2020-11-11 00:10:39 【问题描述】:

我正在使用 TypeScript 创建一个 Expo 托管的 React Native 应用程序,但在使用 React Navigation 和 TypeScript 时遇到了一些问题。

我想在 Tab.Screen 组件上指定底部选项卡导航器的图标。

此代码有效,但由于 route.params 可能未定义(第 10 行)而报错。

“对象”类型上不存在属性“图标”

我可以在 initialParams 上制作所需的图标道具吗?

我查看了文档没有任何运气。

const App: React.FC<> = () => 
  return (
    <SafeAreaView style=styles.container>
      <NavigationContainer>
        <Tab.Navigator
          screenOptions=( route ) => (
            tabBarIcon: ( size, color ) => (
              <MaterialIcons
                size=size
/* ===> */      name=route.params.icon
                color=color
              />
            ),
          )
        >
          <Tab.Screen
            name="EventListView"
            initialParams= icon: 'view-agenda' 
            component=EventListScreen
          />
          <Tab.Screen
            name="CreateEvent"
            initialParams= icon: 'public' 
            component=SettingsScreen
          />
        </Tab.Navigator>
      </NavigationContainer>
    </SafeAreaView>
  )

【问题讨论】:

【参考方案1】:

import RouteProp from '@react-navigation/native';

  route: RouteProp< params:  icon: ICON_TYPE  , 'params'>

我最近遇到了同样的问题,我想出了这个,它似乎工作正常。

【讨论】:

【参考方案2】:

这样做的正确方法是使用参数定义一个类型,并在创建导航器时将其作为类型参数发送。像这样的:

type TabNavigatorParamList = 
  EventListView:  icon: string 
  CreateEvent:  icon: string 


const Tab = createBottomTabNavigator<TabNavigatorParamList>(); //*

* 我假设您的 Tab 组件是 BottomTabNavigator,但无论您使用哪种 createwhateverNavigator,相同的代码都可以工作。

就像您的 Tab.NavigatorTab.Screen 将为其 route 属性设置正确的类型。

还有更多信息 in the docs,以及更高级的情况,例如注释钩子和嵌套导航器。

【讨论】:

【参考方案3】:

我认为您可以使用以下语法:

name=route.params?.icon

否则使用这个:

name=route.params?.icon ?? 'defaultName'

根据文档,此语法可防止在某些情况下未定义参数,并在 params.someParam 未定义或为空时提供默认值。

欲了解更多信息,请阅读此处:https://reactnavigation.org/docs/upgrading-from-4.x/#no-more-getparam。

【讨论】:

感谢您的回答。我只是觉得这是围绕 TypeScript 工作的。我是一个完美的世界,我永远不应该被定义,但我想它可以完成这项工作。 这只是可选的链接。如果您希望您的编辑在您打字时给出建议,那么 Robert 的上述回答是首选。

以上是关于反应导航 route.params 打字稿的主要内容,如果未能解决你的问题,请参考以下文章

打字稿:类型上不存在属性“导航”省略反应导航v5

如何在反应打字稿的导航栏中创建动态元素

反应导航:如何在打字稿中使用 NavigationStackScreenComponent 类型传递 redux 道具

反应导航 route.params 未定义

反应打字稿打字不起作用

为我的反应打字稿组件库生成/维护打字稿定义文件