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

Expo-Router v2带对象参数的类型化路由实现咨询

Expo Router 类型化路由(含复杂对象参数)实现方案

一、路由文件命名规则

如果你的参数是查询参数(即通过?key=value拼接在URL后的参数,如示例中的id/description等),路由文件直接按正常页面命名即可。比如目标页面是home,就创建app/home.tsx,不需要用[slug].tsx这类动态路径命名(动态路径命名适用于路径参数,比如/user/123中的123)。

二、自定义路由参数类型实现类型校验

Expo Router默认的自动类型生成只覆盖动态路径参数,复杂查询参数需要手动扩展类型。在项目中创建类型声明文件(如app/types/router.d.ts),扩展Expo Router的内置类型:

// app/types/router.d.ts
import 'expo-router';

// 定义所有页面的参数类型映射
type RouteParams = {
  home: {
    id: string | number;
    description: string;
    age: string | number;
    name: string;
  };
  // 可添加其他页面的参数类型,比如:
  // user: { userId: string; role: 'admin' | 'user' }
};

// 扩展Expo Router的Link和Router类型
declare module 'expo-router' {
  interface LinkProps<T extends string = string> {
    href: {
      pathname: T;
      params: RouteParams[T];
    };
  }

  interface Router {
    push<T extends string>(href: {
      pathname: T;
      params: RouteParams[T];
    }): void;
  }
}

配置完类型后,router.push和<Link>的href会自动触发类型校验,参数缺失或类型不匹配时TypeScript会直接报错:

import { router, Link } from 'expo-router';

// 正确用法:参数完全匹配类型
router.push({
  pathname: 'home',
  params: {
    id: 1,
    description: '测试描述',
    age: 25,
    name: '张三'
  }
});

// <Link>组件同样支持类型校验
<Link 
  href={{
    pathname: 'home',
    params: { id: 2, description: '', age: 30, name: '李四' }
  }}
>
  跳转到Home页
</Link>

四、目标页面接收并处理参数

useLocalSearchParams返回的参数默认都是字符串类型(因为URL查询参数本质是字符串),需要手动转换为对应类型,同时可以用类型断言约束参数结构:

// app/home.tsx
import { useLocalSearchParams } from 'expo-router';

// 定义页面参数类型(和RouteParams中的home字段一致)
type HomeParams = {
  id: string;
  description: string;
  age: string;
  name: string;
};

const Home = () => {
  // 获取带类型约束的查询参数
  const params = useLocalSearchParams<HomeParams>();

  // 转换为业务所需的类型
  const id = Number(params.id);
  const age = Number(params.age);
  const description = params.description || '';
  const name = params.name || '';

  return (
    <>
      <p>ID: {id}</p>
      <p>姓名: {name}</p>
      <p>年龄: {age}</p>
      <p>描述: {description}</p>
    </>
  );
};

export default Home;

关键说明

  • 路径参数 vs 查询参数:如果参数是单个标识(如用户ID),推荐用动态路径参数([id].tsx);如果是多个字段组成的对象,用查询参数更灵活。
  • 类型一致性:确保RouteParams中的类型和页面接收时的转换逻辑一致,避免类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:35:19