Об этом уже спрашивали, но я считаю, что у меня другой контекст. Я запускаю приложение React, настроенное на Create React App
, с флагом --typescript
.
Я попытался настроить eslint, prettier и husky для запуска сценария прекомпиляции, и все пошло не так.
Ошибка, которую я получаю: 'import' and 'export' may only appear at the top level
и связана с этой строкой в следующем компоненте:
export default SignUp
import React from 'react'
import { Link, withRouter } from 'react-router-dom'
import { compose } from 'recompose'
import { withFirebase } from '../Firebase'
import * as ROUTES from '../../constants/routes'
const SignUp = () => (
<div>
<h1>SignUp</h1>
<SignUpForm />
</div>
)
interface Props {
firebase: any
}
const Admin = ({ firebase }: Props) => {
const SignUpFormData = ({ firebase, ...props }: Props) => {
const initialState = {
username: '',
email: '',
password: '',
repeatPassword: '',
}
const stateReducer = (state, update) => ({ ...state, ...update })
const [state, dispatch] = React.useReducer(stateReducer, initialState)
const [error, setError] = React.useState({})
const formIsInvalid =
state.password !== state.repeatPassword ||
state.password === '' ||
state.username === '' ||
state.email === ''
const onSubmit = event => {
event.preventDefault()
const { username, email, password } = state
firebase
.auth()
.createUserWithEmailAndPassword(email, password)
.then(res => {
return firebase
.database()
.ref(`users/${res.user.uid}`)
.set({
username,
email,
})
})
.then(() => {
dispatch(initialState)
props.history.push(ROUTES.HOME)
})
.catch(error => setError(error))
}
const handleChange = ({ currentTarget: { name, value } }) => {
dispatch({ [name]: value })
}
return (
<form onSubmit={onSubmit}>
<input
name="username"
value={state.username}
onChange={handleChange}
placeholder="Full name"
/>
<input
name="email"
value={state.email}
onChange={handleChange}
placeholder="Email"
/>
<input
name="password"
type="password"
value={state.password}
onChange={handleChange}
placeholder="Password"
/>
<input
name="repeatPassword"
type="password"
value={state.repeatPassword}
onChange={handleChange}
placeholder="Repeat password"
/>
<button disabled={formIsInvalid} type="submit">
Sign Up
</button>
{error && <p>{error.message}</p>}
</form>
)
}
const SignUpLink = () => (
<p>
Don't have an account yet? <Link to={ROUTES.SIGN_UP}>Sign Up</Link>
</p>
)
const SignUpForm = compose(
withRouter,
withFirebase,
)(SignUpFormData)
export default SignUp
export { SignUpForm, SignUpLink }
Я попытался удалить записи eslint из моего package.json , удалить yarn.lock
, удалить node_modules и переустановить deps, но без радости.
У кого-нибудь есть предложения, с чего начать отладку, я заблудился?
Любая дополнительная информация, пожалуйста, кричите.
Большое спасибо.
Редактировать
Кроме того, я изначально написал часть приложения для аутентификации в стандартном js с целью изучения JS, и эти проблемы произошли, когда я находился в процессе преобразования приложения в файлы Typescript, поэтому у меня есть смесь .js
и .tsx
. Я не уверен, что это актуально.