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

如何在TypeScript的SolidJS中将路由子元素传递给根App组件

SolidJS Router 配置式路由类型错误解决(版本^0.13.6)

我在TypeScript中使用@solidjs/router(版本^0.13.6)实现配置式路由,希望将路由元素传递给根组件App,但遇到了类型错误。原代码如下:

export const routes: RouteDefinition[] = [
  {
    path: '/',
    component: Home,
  },
]

const App: Component = (children: JSX.Element) => {
  return (
    <>
      <Navbar />
      <main>
        {children}
      </main>
      <Footer />
    </>
  );
}


render(
  () => (
    <Router root={App}>
      {routes}
    </Router>
  ),
  root,
);

遇到的错误

  1. App组件类型错误:
Type '(children: JSX.Element) => JSX.Element' is not assignable to type 'Component'.
  Types of parameters 'children' and 'props' are incompatible.
    Type '{}' is not assignable to type 'Element'.
  1. {children}使用错误:
Property 'children' does not exist on type 'JSX.IntrinsicElements'

解决方法

1. 修正App组件的Props类型

SolidJS的Component类型要求参数是一个props对象,而非直接传入children。你需要正确定义包含children的props类型:

import type { Component, ComponentPropsWithChildren } from 'solid-js';

// 方式一:显式定义props接口
interface AppProps {
  children: JSX.Element;
}

const App: Component<AppProps> = ({ children }) => {
  return (
    <>
      <Navbar />
      <main>{children}</main>
      <Footer />
    </>
  );
};

// 方式二:使用ComponentPropsWithChildren简化
const App: ComponentPropsWithChildren<{}> = ({ children }) => {
  return (
    <>
      <Navbar />
      <main>{children}</main>
      <Footer />
    </>
  );
};

2. 修正Router的配置式路由用法

在@solidjs/router v0.13.x中,配置式路由需要通过Router组件的routes属性传递,而非直接将路由数组作为子元素:

import { Router, RouteDefinition } from '@solidjs/router';
import { render } from 'solid-js/web';

export const routes: RouteDefinition[] = [
  {
    path: '/',
    component: Home,
  },
];

// 修正后的render部分
render(
  () => (
    <Router root={App} routes={routes} />
  ),
  root,
);

完整修正后的代码

import { Router, RouteDefinition } from '@solidjs/router';
import { render, ComponentPropsWithChildren } from 'solid-js/web';
import Home from './Home';
import Navbar from './Navbar';
import Footer from './Footer';

export const routes: RouteDefinition[] = [
  {
    path: '/',
    component: Home,
  },
];

const App: ComponentPropsWithChildren<{}> = ({ children }) => {
  return (
    <>
      <Navbar />
      <main>{children}</main>
      <Footer />
    </>
  );
};

render(
  () => <Router root={App} routes={routes} />,
  document.getElementById('root')!
);

关键说明

  • SolidJS组件的props始终是一个对象,即使只接收children,也要通过解构从props对象中获取。
  • @solidjs/router v0.13.x的配置式路由需通过routes属性传递路由数组,而非子元素形式。

内容的提问来源于stack exchange,提问者Dukhi Atma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:31:09