当 Stack Screens/Stack 屏幕名称在运行时生成时,如何键入检查 React Navigator 的 Stack Navigation 路由?

How do I type check React Navigator's Stack Navigation routes when the Stack Screens/Stack Screen name are generated at runtime?

我目前正在为应用程序使用 React Navigation,我对 TS 比较陌生,因此需要一些关于如何执行此操作的建议。

我的问题是我正在复制 React Navigations 建议的导航器类型检查,但我不确定如何为从对象数组动态生成的堆栈屏幕添加映射。

React Navigation 文档建议我们这样做...

type ShopParamsList = {
  Shop: Array<NavigationItem>;
}; 

const Stack = createStackNavigator<ShopParamsList>();

这对我的第一个堆栈屏幕来说很好,看起来像这样

   <Stack.Screen
       name='Shop'
       component={CategoryPage}
       ...
       />

然而,其他屏幕是从数据数组生成的,我们正在从数组中的数据设置组件的名称,就像这样...

   {categoryNavigation.map((item: NavigationItem, key) => {
          if (item.Data.Url !== null) {
            return (
              <Stack.Screen
                key={key}
                name={item.Data.Url}   //here
                }}
                component={CategoryPage}
                ...
              />
})

因此,我不确定如何输入检查屏幕,因为它们是动态生成的

   type ShopParamsList = {
      Shop: Array<NavigationItem>;
      //Other Screens: Other Screen Params
   }; 

那么如何将正确的映射传递到这些屏幕的此对象类型中呢? 谢谢!

你不能。 TypeScript 是一个静态类型检查器,它不能对动态数据进行类型检查。除非您事先知道所有名称,否则无法对这段代码进行类型检查。

但是,您可能不应该动态创建所有这些屏幕,因为它们基本上是具有不同数据的相同屏幕,您应该改为使用单个屏幕:

<Stack.Screen
  name='Category'
  component={CategoryPage}
  getId={({ params }) => params.item.Data.Url}
/>

然后,在导航时,您应该在参数中传递该数据:

navigation.navigate('Category', { item })

那么你可以为这个屏幕定义一个类型:

Category: { item: NavigationItem };