我正在尝试从route.params获取我的事件对象,但我不知道如何使打字稿识别该道具。
这是导航到我的 Detail 页面的功能,将事件传递给参数:
const navigateToDetail = (incident: IncidentProps): void => {
navigation.navigate('Detail', { incident });
};
这是“详细信息”页面代码的一部分,在这里我尝试从route.params获取此对象:
type IncidentRouteParams = {
incident: IncidentProps;
}
const Detail: React.FC = () => {
const navigation = useNavigation();
const route = useRoute();
const incident = route.params.incident;
我认为我需要通过某种 IncidentRouteParams 类型来传递 const route = useRoute()
谢谢。
Here is the image with the error
编辑:
我确实喜欢这样,并且它起作用了,但是我不知道这是否是正确的方法:
const route = useRoute<RouteProp<Record<string, IncidentRouteParams>, string>>();
const incident = route.params.incident;
答案 0 :(得分:8)
昨天刚刚这样做!
TLDR: 首先,您需要为每个屏幕名称及其接收的参数定义一个类型:
type ParamList = {
Detail: {
incident: IncidentProps;
};
};
然后您在RouteProp
中使用该参数和屏幕名称:
const route = useRoute<RouteProp<ParamList, 'Detail'>>();
的文档
答案 1 :(得分:1)
您也可以根据您想要的 ParamList 创建一个类型,因此您只需将该类型导入您的组件并将 RouteName 作为参数传递即可。
import { RouteProp } from '@react-navigation/native';
export type RootStackParamList = {
Home: undefined;
Feed: { sort: 'latest' | 'top' };
};
export type RootRouteProps<RouteName extends keyof RootStackParamList> = RouteProp<
RootStackParamList,
RouteName
>;
用法:
export const Feed = () => {
const route = useRoute<RootRouteProps<'Feed'>>();
return <Text>{route.params.sort}</Text>
}
答案 2 :(得分:0)
这太复杂了。有一种更简单的方法可以在 TS 中设置 initialParams。
设置:
type StackParamList = {
TheSource: { endpoint: string; type: string;};
BenefitDetail: React.FC;
ItineraryMain: {reFetch: boolean;};
Today: React.FC;
};
const Stack = createStackNavigator<StackParamList>();
然后在使用时:
const TheSourceRoute = (): React.ReactElement => {
return (<StackNavigator id="TheSource" element={
<Stack.Screen name="TheSource" component={WebviewModal} initialParams={{ endpoint: sourceUrl, type: 'directsource' }}
options={{
title: 'The Source',
}}/>
}/>
);
};