You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native中MaterialTopTabNavigation导航与Props类型校验问题

React Navigation Material Top Tabs Navigator TypeScript 类型错误问题

我搭建了包含Shipping、Payment、Confirm三个页面的Material Top Tabs Navigator,点击确认按钮时需要从Shipping向Payment、Payment向Confirm传递order对象,同时页面需要访问navigation和route props,但当前配置下,createMaterialTopTabNavigator文件出现TypeScript错误。

相关代码

types.tsx

import { MaterialTopTabScreenProps, MaterialTopTabNavigationProp,
} from "@react-navigation/material-top-tabs";
import { RouteProp } from "@react-navigation/native";
import { order } from "./utils/interface";

 export type CheckoutTopTabParamList = {
  Shipping: undefined;
  Payment: { order: order; };
  Confirm: { order: order; };
};

export type CheckoutTopTabProps<Screen extends keyof CheckoutTopTabParamList> =
  MaterialTopTabScreenProps<CheckoutTopTabParamList, Screen>;

// 我还尝试了另一种写法:
// export type CheckoutTopTabProps<T extends keyof CheckoutTopTabParamList> = {
//   navigation: MaterialTopTabNavigationProp<CheckoutTopTabParamList, T>;
//   route: RouteProp<CheckoutTopTabParamList, T>;
// };

Shipping页面:Checkout.tsx

import { CheckoutTopTabProps } from "../../../types";
import { setOrder } from "../../../redux/slices/orderItemsSlice";

const Checkout = ({ navigation }: CheckoutTopTabProps<"Shipping">) => {

  const checkOut = () => {
    navigation.navigate("Payment", { order });
  };

return (
  <FormContainer>
   <KeyboardAwareScrollView>
    {/* 页面内容省略 */}
    <View style={{ width: "80%", alignItems: "center" }}>
          <Button title="Confirm" onPress={checkOut} />
        </View>
     </KeyboardAwareScrollView>
  </FormContainer>
  );
}

Payment页面:Payment.tsx

import { CheckoutTopTabProps } from "../../../types";

export type PaymentProps = {
  order: order;
  navigation: CheckoutTopTabProps<"Payment">["navigation"];
  route: CheckoutTopTabProps<"Payment">["route"];
};

const Payment = ({ order, navigation, route }: PaymentProps) => {
return (
<View>
  {/* 页面内容省略 */}
  <View style={{ marginTop: 60, alignSelf: "center" }}>
          <Button
            title={"Confirm"}
            onPress={() => navigation.navigate("Confirm", { order })}
          />
        </View>
</View>
)
}

导航器文件:CheckoutTopTabNavigator.tsx

import React from "react";
import { createMaterialTopTabNavigator } from "@react-navigation/material-top-tabs";

// Screens
import Checkout from "../screens/Cart/Checkout/Checkout";
import Payment from "../screens/Cart/Checkout/Payment";
import Confirm from "../screens/Cart/Checkout/Confirm";
import { RootState } from "../redux/store";
import { useSelector } from "react-redux";

const Tab = createMaterialTopTabNavigator();

function MyTabs() {
    const order = useSelector((state: RootState) => state.orderItems.order);
  return (
    <Tab.Navigator>
      <Tab.Screen name="Shipping" component={Checkout} />
      <Tab.Screen name="Payment" component={Payment} />
      <Tab.Screen name="Confirm" component={Confirm} />
    </Tab.Navigator>
  );
}

export default function CheckoutTopTabNavigator() {
  return <MyTabs />;
}
// 错误出现在此文件中

错误信息

错误截图显示类型不匹配,最终错误提示包含:(MaterialTopTabNavigationOptions, MaterialTopTabNavigationEventMap>')

尝试过的方案

我尝试通过Redux状态传递order props,修改导航器代码如下:

const Tab = createMaterialTopTabNavigator();

function MyTabs() {
    const order = useSelector((state: RootState) => state.orderItems.order);
  return (
    <Tab.Navigator>
      <Tab.Screen name="Shipping" component={Checkout} />
      <Tab.Screen
        name="Payment"
        children={(props) => <Payment order={order} {...props} />}
      />
      <Tab.Screen
        name="Confirm"
        children={() => <Confirm order={order} />}
      />
    </Tab.Navigator>
  );
}

内容的提问来源于stack exchange,提问作者zackOverflow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:55:35