面试题答案
一键面试- 定义路由类型:
- 首先定义一个基础的路由配置对象类型,它需要包含路由的路径、名称等常见属性,同时考虑静态组件和动态组件的不同处理。
- 对于静态组件,直接定义组件类型;对于动态组件,使用
React.lazy
返回的类型(React.LazyExoticComponent
)。
import React from'react'; // 定义静态路由组件类型 type StaticRouteComponent = React.ComponentType; // 定义动态路由组件类型 type DynamicRouteComponent = React.LazyExoticComponent<React.ComponentType>; // 定义路由配置对象类型 type RouteConfig = { path: string; name: string; component: StaticRouteComponent | DynamicRouteComponent; // 可以添加其他属性,如meta等 meta?: { [key: string]: any }; };
- 确保动态加载组件的正确使用:
- 当使用动态加载组件时,TypeScript会根据
React.lazy
的返回类型自动进行类型检查。 - 在路由渲染时,例如在
React Router
中,可以这样处理:
import { BrowserRouter as Router, Routes, Route } from'react-router-dom'; const routes: RouteConfig[] = [ { path: '/home', name: 'Home', component: React.lazy(() => import('./components/HomeComponent')), }, { path: '/about', name: 'About', component: React.lazy(() => import('./components/AboutComponent')), }, ]; const App: React.FC = () => { return ( <Router> <Routes> {routes.map((route) => { return ( <Route key={route.name} path={route.path} element={ React.lazy(() => { if ('default' in route.component) { return Promise.resolve({ default: route.component }); } else { return route.component; } }) } /> ); })} </Routes> </Router> ); };
- 这里通过
React.lazy
确保动态组件在加载和渲染时的类型安全。React.lazy
接受一个函数,该函数返回一个动态导入组件的Promise
。TypeScript会确保导入的组件类型符合React.ComponentType
。
- 当使用动态加载组件时,TypeScript会根据
- 对加载状态进行类型约束:
- 可以使用
React.Suspense
来处理动态组件的加载状态。React.Suspense
需要一个fallback
属性,用于在组件加载时显示加载指示器。 - 定义加载状态类型:
type LoadingState = { isLoading: boolean; };
- 使用
React.Suspense
时:
const App: React.FC = () => { const [loadingState, setLoadingState] = React.useState<LoadingState>({ isLoading: false, }); return ( <Router> <React.Suspense fallback={ <div> {loadingState.isLoading && <p>Loading...</p>} </div> } > <Routes> {routes.map((route) => { return ( <Route key={route.name} path={route.path} element={ React.lazy(() => { setLoadingState({ isLoading: true }); if ('default' in route.component) { return Promise.resolve({ default: route.component }); } else { return route.component.then(() => { setLoadingState({ isLoading: false }); return route.component; }); } }) } /> ); })} </Routes> </React.Suspense> </Router> ); };
- 在动态组件加载的
Promise
处理中,通过useState
来更新加载状态,确保加载状态类型的正确性,并且在React.Suspense
的fallback
中正确显示加载指示器。
- 可以使用
通过以上方案,可以在TypeScript中实现对前端项目路由类型的约束,既能处理静态路由组件,也能正确处理动态加载组件及其加载状态。