импорт и экспорт могут появляться только на верхнем уровне - CRA React App с Typescript - PullRequest
2 голосов
/ 05 июля 2019

Об этом уже спрашивали, но я считаю, что у меня другой контекст. Я запускаю приложение 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. Я не уверен, что это актуально.

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Я думаю, что понял, просто отсутствует закрывающая фигурная скобка.

Возможно здесь:

const Admin = ({ firebase }: Props) => {

не закрыто.

1 голос
/ 05 июля 2019

Существует несколько способов экспортировать метод из одного файла в другой.

Вы можете напрямую добавить ключевое слово экспорта, как показано ниже:

export const SignUpLink = () => (
  <p>
    Don't have an account yet? <Link to={ROUTES.SIGN_UP}>Sign Up</Link>
  </p>
)

export const SignUpForm = compose(
  withRouter,
  withFirebase,
)(SignUpFormData)

Если нет, у вас может быть module.exports в конце файла, как показано ниже:

module.exports = {
 SignUpForm, SignUpLink
}

Я бы порекомендовал вам взглянуть на эту ссылку . Это может определенно помочь.

Если вы используете машинопись, пожалуйста, добавьте правила печати, это много раз спасет вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...