Что не так с моим пользовательским маршрутом аутентификации react-router?
К сожалению, мне не удалось создать пользовательский маршрут с помощьюreact-router версии 4 . Я пытаюсь построить маршрут, который отображает компонент, если пользователь аутентифицирован или перенаправляет пользователя к компоненту входа в систему в другом случае.
Я использую эту страницу документации, чтобы начать работу.
const ProtectedRoute = ({component, ...rest}) => (
<Route {...rest} render={props => false
? <Component {...props} />
: <Redirect to={{pathname: '/login', state: {from: props.location}}}/>}
/>
);
Я использую это ProtectedRoute
так:
<ProtectedRoute exact path='/' component={testComponent}/>
Когда я выполняю это, я получаю следующую ошибку времени выполнения:
Uncaught ReferenceError: __rest is not defined
at ProtectedRoute (index.tsx:19)
at ReactCompositeComponent.js:305
at measureLifeCyclePerf (ReactCompositeComponent.js:75)
at ReactCompositeComponentWrapper._constructComponentWithoutOwner (ReactCompositeComponent.js:304)
at ReactCompositeComponentWrapper._constructComponent (ReactCompositeComponent.js:279)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:187)
at Object.mountComponent (ReactReconciler.js:45)
at ReactDOMComponent.mountChildren (ReactMultiChild.js:236)
at ReactDOMComponent._createInitialChildren (ReactDOMComponent.js:703)
at ReactDOMComponent.mountComponent (ReactDOMComponent.js:522)
Вот еще немного информации о стек, который я использую:
- реагировать 15.6.1
- react-router-dom 4.2.2
- машинопись 2.5.2
Почему rest
не определено? Что не так с моим собственным маршрутом?
Заранее благодарю вас!
Обновление (минимальный пример)
Минимальный пример задачи можно найтиздесь . Чтобы запустить пример, выполните следующие действия:
- установить зависимости с помощью
yarn install
- запустите dev-сервер с помощью
yarn dev
- перейти к http://localhost:8080
2 ответа:
Ладно, я знаю, что происходит. В вашем
tsconfig.json
вы объявили это правило"noEmitHelpers": true
, которое говорит компилятору typescript не включать в выходные данные никакие функции помощников, такие как__rest
. Вот почему у вас есть ошибка времени выполнения с__rest is not defined
. Изменение его наfalse
должно решить вашу проблему.
Я не специалист по машинописи и еще не погружался в TS, но это определенно проблема, связанная с вашей попыткой использовать оператор
...rest
. Я предполагаю, что ts не любит оператор spread в деструктурировании объекта и, следовательно, следующую структуру (хотя она будет отлично работать в ES6):ProtectedRoute = ({component: Component, isAuthenticated, ...rest}) => {
Если вы перепишете свой компонент с явным использованием
path
prop, он снова будет хорошо работать.const ProtectedRoute = ({component: Component, isAuthenticated, path}) => { return <Route path={path} render={props => isAuthenticated ? <Component {...props} /> : <Redirect to={{pathname: '/login', state: {from: props.location}}} />} /> };
Но тот факт, что ваш код не работает, кажется мне странным, так как это упоминалось, что начиная с версии 2.1 typescript поддерживает spread/rest в рамках деструктурирования объектов: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html#object-spread-and-rest