javascript - Konvertera const-funktionskod från JSX till TSX
Jag försöker konvertera hur en alternativ ruttkomponent definieras i JSX till en motsvarande TypeScript TSX-fil. (1)
JSX-syntaxen ser ut så här:
import React from 'react';
import { Route, Redirect } from 'react-router-dom';
export const PrivateRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={props => (
localStorage.getItem('user')
? <Component {...props} />
: <Redirect to={{ pathname: '/login', state: { from: props.location } }} />
)} />
)
Jag har försökt att konvertera det till TypeScript, men i Visual Studio är <Component-delen (se nedan) understruken och TypeScript-kompilatorn säger till mig
(TS) JSX element type 'Component' does not have any construct or call signatures.
Jag förstår verkligen inte syntaxen ({ component: Component, ...rest }) för lambda-funktionen. Detta är så långt jag har kommit med att skriva det i TypeScript.
export function PrivateRoute(Component: React.Component, ...rest: any[]) {
return (
<Route {...rest} render={props => (
localStorage.getItem('user')
? <Component {...props} />
: <Redirect to={{ pathname: '/login', state: { from: props.location } }} />
)} />
);
};
Några förslag?
Referenser :
- https://www.pointblankdevelopment.com.au/blog/135/react-redux-with-aspnet-core-20-login-registration-tutorial-example#private-route-jsx
Svar #1
Angående felet - JSX/TSX <Component ... kommer att konverteras till något som React.createElement(Component..., så Component-typen bör vara en funktion/klass, inte en instans. Därför kommer korrekt typning för det att vara ComponentType.
Angående { component: Component, ...rest } - detta är en objektdestrukturering med tilldelning till en ny variabel. Den passerade parametern packas upp till variablerna Component och rest (component-egenskapen hos parametern går till Component-variabeln och alla övriga egenskaper går till rest-variabeln)
Sammanfattningsvis kan den resulterande typningen se ut så här:
type RouteProps = { component: React.ComponentType };
export function PrivateRoute(
{ component: Component, ...rest }: RouteProps) {
...
};
