【发布时间】:2021-10-14 17:45:37
【问题描述】:
我正在尝试从 React Navigation 中键入 useNavigation。我希望能够只传递路线的名称,但除非我也传递该路线的道具,否则我会收到错误消息。
在the documentation 之后,我知道实现应该是这样的:
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。如果我为该路线添加道具,错误就会消失,但我不应该这样做。
navigation.navigate('Home', { foo: 'hello', onBar: () => {} })
查看navigation.navigate 的类型声明(见下文),这应该不是必需的,因为简单地将路由名称作为唯一参数传递存在重载。我一定是做错了什么,因为这是不被接受的......但是什么,在哪里以及为什么?
Here is a CodeSandBox reproducing the TypeError.
React Navigation types.d.ts (link)
navigate<RouteName extends keyof ParamList>(...args: undefined extends ParamList[RouteName]
? [screen: RouteName] | [screen: RouteName, params: ParamList[RouteName]]
: [screen: RouteName, params: ParamList[RouteName]])
: void;
【问题讨论】:
-
请分享可重现的示例。你从哪里得到
useNavigation或AboutProps。请在 ts 操场上分享您的示例 -
我添加了一个 CodeSandBox。
-
能否提供
React Navigation types.d.ts的链接?我只是看到只有一个参数没有重载 -
我在 React Navigation 中添加了类型声明的链接。如我所见,第一个三元表达式可以是
screen: RouteName或相同的加上参数(路由道具)。我可能读错了。
标签: typescript react-native react-navigation react-navigation-stack