typescript - 如何在 React Navigation 中正确键入 useNavigation?
问题描述
我正在尝试useNavigation
从 React Navigation 中输入。我希望能够只传递路线的名称,但除非我也传递该路线的道具,否则我会收到错误消息。
按照文档,我理解实现应该是这样的:
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
(见下文)的类型声明,这应该不是必需的,因为简单地将路由名称作为唯一参数传递存在重载。我一定是做错了什么,因为这是不被接受的……但是什么,在哪里,为什么?
这是一个重现 TypeError 的 CodeSandBox。
React Navigation types.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;
解决方案
我在最后一行得到一个 TypeError 。如果我为该路线添加道具,错误就会消失,但我不应该这样做。
您在类型中指定了这一点:
Home: { foo: string, onBar: () => void }
这意味着Home
需要这些参数。如果您的路线不使用任何参数并且您可以这样做navigate('Home')
,那么您不应该在类型中指定任何参数。
如果这些参数是可选的,那么您需要相应地指定类型:
Home: { foo: string, onBar: () => void } | undefined
推荐阅读
- c# - 何时在 EF Core 中使用异步方法?
- php - 如何防止一个模型在 OneToOne 关系中有多个模型?[拉拉维尔]
- apache-kafka - 用于 API 生成消息、创建消费者组、订阅消费者组和读取记录的 Kafka 命令
- json - JQ 键映射名称为大写并删除空格
- java - TreeSet 中的 Java 私有整数
- flutter - 如何重置 ListView.Builder 索引
- css - 为什么我不能正确旋转 Safari 和 iPhone 中的重叠元素?
- react-native - 重新激活的 useCode 挂钩无法按预期工作
- python - Python 乌龟点无缘无故闪烁
- javascript - Wordpress 在另一个 Js 文件中加载 JS 文件