以打字稿友好的方式编写 PrivateRoute 组件
Write PrivateRoute Component in a typescript friendly way
我正在学习在 Typescript 中使用 React Router。我也在阅读这篇关于如何在 typescript+react router 中实现 PrivateRoutes 的文章。
https://tylermcginnis.com/react-router-protected-routes-authentication/
上面的博客有一个代码段来实现 PrivateRoute 作为
const PrivateRoute = ({component: Component, ...rest}) => (
<Route {...rest} render={(props) => (
isLoggedIn.isAuthenticated === true ? <Component {...props} /> : <Redirect to='/login' />
)} />
)
但是我的打字稿编译器不喜欢上面的代码
ERROR in [at-loader] ./src/components/Main.tsx:19:35
TS7031: Binding element 'Component' implicitly has an 'any' type.
Child html-webpack-plugin for "index.html":
我如何修改上面的这段代码,使其变得对打字稿友好?
我用这段代码来模仿路线:
export const PrivateRoute = ({ component, ...rest }: RouteProps) => {
if (!component) {
throw Error("component is undefined");
}
const Component = component; // JSX Elements have to be uppercase.
const render = (props: RouteComponentProps<any>): React.ReactNode => {
if (fakeAuth.isAuthenticated) {
return <Component {...props} />;
}
return <Redirect to={{ pathname: '/login' }} />
};
return (<Route {...rest} render={render} />);
}
Route 的原始定义是Route<T extends RouteProps = RouteProps> extends React.Component<T, any>
,但是对于Typescript 2.9,目前无法在泛型的第一行使用扩展运算符,这就是为什么使用通用的RouteProps 类型。
renaming destructured properties 有一个 Typescript 语法。
在构建私有路由时,是这样的:
const PrivateRoute = ({component: Component, ...rest}: {component: any}) => (
...
)
我正在学习在 Typescript 中使用 React Router。我也在阅读这篇关于如何在 typescript+react router 中实现 PrivateRoutes 的文章。
https://tylermcginnis.com/react-router-protected-routes-authentication/
上面的博客有一个代码段来实现 PrivateRoute 作为
const PrivateRoute = ({component: Component, ...rest}) => (
<Route {...rest} render={(props) => (
isLoggedIn.isAuthenticated === true ? <Component {...props} /> : <Redirect to='/login' />
)} />
)
但是我的打字稿编译器不喜欢上面的代码
ERROR in [at-loader] ./src/components/Main.tsx:19:35
TS7031: Binding element 'Component' implicitly has an 'any' type.
Child html-webpack-plugin for "index.html":
我如何修改上面的这段代码,使其变得对打字稿友好?
我用这段代码来模仿路线:
export const PrivateRoute = ({ component, ...rest }: RouteProps) => {
if (!component) {
throw Error("component is undefined");
}
const Component = component; // JSX Elements have to be uppercase.
const render = (props: RouteComponentProps<any>): React.ReactNode => {
if (fakeAuth.isAuthenticated) {
return <Component {...props} />;
}
return <Redirect to={{ pathname: '/login' }} />
};
return (<Route {...rest} render={render} />);
}
Route 的原始定义是Route<T extends RouteProps = RouteProps> extends React.Component<T, any>
,但是对于Typescript 2.9,目前无法在泛型的第一行使用扩展运算符,这就是为什么使用通用的RouteProps 类型。
renaming destructured properties 有一个 Typescript 语法。
在构建私有路由时,是这样的:
const PrivateRoute = ({component: Component, ...rest}: {component: any}) => (
...
)