我尝试从React Navigation输入useNavigation
。我希望能够只传递路线的名称,但我得到一个错误,除非我也传递该路线的 prop 。
根据文档,我理解实现应该如下所示:
import { StackNavigationProp } from '@react-navigation/stack';
type StackParamList = {
Home: { foo: string, onBar: () => void }
About: AboutProps
}
type NavigationProps = StackNavigationProp<StackParamList>
const MyComponent = () => {
const navigation = useNavigation<NavigationProps>()
const handleOnNavigate = () => navigation.navigate('Home')
// ^ TypeError!
我在最后一行得到了一个TypeError。如果我为那个路径添加了props,错误就会消失,但是我不应该这样做。
navigation.navigate('Home', { foo: 'hello', onBar: () => {} })
看一下navigation.navigate
的类型声明(见下文),这应该是不必要的,因为有一个重载只传递路由的名称作为唯一的参数。我一定是做错了什么,因为这是不接受的...但是什么,在哪里,为什么?
Here is a CodeSandBox reproducing the TypeError.
- React导航类型. d. ts**(链接)
navigate<RouteName extends keyof ParamList>(...args: undefined extends ParamList[RouteName]
? [screen: RouteName] | [screen: RouteName, params: ParamList[RouteName]]
: [screen: RouteName, params: ParamList[RouteName]])
: void;
4条答案
按热度按时间up9lanfz1#
我在最后一行得到了一个TypeError。如果我为那个路径添加了props,错误就会消失,但是我不应该这样做。
您在类型中指定了此选项:
这意味着
Home
需要这些参数,如果你的路径不需要任何参数,你可以只使用navigate('Home')
,你不应该在类型中指定任何参数。如果这些参数是可选的,则需要相应地指定类型:
eeq64g8w2#
在类型
StackParamList
中,你可以定义导航到屏幕时需要的参数类型。如果你不需要Home的任何参数,你也需要在类型中相应地定义它:如果您希望有任何其他可选参数,则可以在类型声明中使用管道符:
作为一种解决方法,您还可以使用另一个重载并传递配置对象:
1sbrub3j3#
为了使它只使用一个参数,您需要添加
| undefined
。我来解释一下你为什么要这么做。
考虑一下这个宣言:
这是最有趣的部分:
undefined extends ParamList[RouteName]
它意味着如果undefined
扩展ParamList[RouteName]
,则只允许使用一个参数。让我们把它分成几个小例子:
您可能已经注意到,如果提供
Home
,TS将需要两个参数,因为ParamList['Home']
返回的对象不能是undefined
。另一方面,
undefined
扩展了ParamList['Undefined']
-因此TS只允许使用一个参数。这就是TS不允许只传递一个参数的原因。
tcbh2hod4#
当使用Typescript时,整个导航都应该是严格类型化的,谢天谢地,我们不需要为它们的实现编写 Package 器,因为我们提供了generic types。
我发现向useNavigation钩子添加类型的最简单方法如下:
如果路由接受参数,则需要更改
RootStackParamList
类型实现还要注意的是,它们不使用
useNavigation
钩子来处理页面/屏幕,而是嵌套得很深的组件,因为导航器已经作为一个prop传递给了传递到Stack.Screen
中的组件,这意味着您也可以通过以下方式使用HomeScreen
的导航器: