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

React Native TypeScript 调用 navigation.navigate 传字符串触发 ts(2345) 报错求助

问题报错

Argument of type 'string' is not assignable to parameter of type '{ key: string; params?: never; merge?: boolean; } | { name: never; key?: string; params: never; merge?: boolean; }'.ts(2345)

报错原因

这个TypeScript报错是因为React Navigation没有获取到你注册的路由页面类型映射,无法校验你传入的"page_2"是合法的路由名称,所以判定你传入的字符串类型不符合参数要求。

完整解决步骤
  • 第一步:定义路由参数列表类型
    新建types/navigation.ts文件,声明你所有路由页面对应的参数类型:
export type RootStackParamList = {
  // 格式为:路由名: 该页面接收的参数类型,无参数填undefined
  page_1: undefined;
  page_2: {
    // 示例参数,按需填写,没有参数直接写undefined即可
    id?: string;
  };
  // 补充所有注册在根导航器的路由
};
  • 第二步:全局注册路由类型
    在同个types/navigation.ts文件中添加全局类型声明,让React Navigation自动读取你的路由类型:
declare global {
  namespace ReactNavigation {
    interface RootParamList extends RootStackParamList {}
  }
}
  • 第三步:给导航器绑定类型
    在你初始化导航器的文件中,给createNativeStackNavigator传入定义好的RootStackParamList泛型:
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { RootStackParamList } from '@/types/navigation';

// 传入泛型绑定路由类型
const Stack = createNativeStackNavigator<RootStackParamList>();

function RootNavigator() {
  return (
    <Stack.Navigator>
      <Stack.Screen name="page_1" component={Page1} />
      <Stack.Screen name="page_2" component={Page2} />
    </Stack.Navigator>
  );
}
  • 可选:页面组件中绑定navigation类型
    如果需要在页面中获取带类型提示的navigation对象,可以按如下方式声明组件props:
import type { NativeStackScreenProps } from '@react-navigation/native-stack';
import type { RootStackParamList } from '@/types/navigation';

// 第二个参数为当前页面的路由名
type Page1Props = NativeStackScreenProps<RootStackParamList, 'page_1'>;

export default function Page1({ navigation }: Page1Props) {
  // 此时调用navigation.navigate会有自动路由名提示,不会触发类型报错
  return <Button text="go to page 2" onPress={()=>navigation.navigate("page_2")} />
}

配置完成后请确认你调用navigate时传入的路由名,和你在RootStackParamList、Stack.Screen的name属性写的完全一致,包括大小写、下划线等符号。

临时解决方案(不推荐)

如果只是临时调试不想配置类型,可以在调用代码上方加// @ts-ignore忽略类型校验,该方法会丢失React Navigation的类型校验能力,不建议长期使用:

<Button 
  text="go to page 2" 
  onPress={()=>{
    // @ts-ignore
    navigation.navigate("page_2")
  }} 
/>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:45:02