Как отправить действие thunk с машинописным текстом

Следуйте официальный документ, я создаю функцию преобразования с помощью машинописного текста.

// store/user/thunk.ts

function loginApi(user: UserState) {
  return fetch(
    `${baseUrl}/login?user=${user.userName}&pwd=${user.pwd}`
  )
    .then(res => res.json())
}

export const thunkLogin = (
  user: UserState
): ThunkAction<void, AppState, null, Action<string>> => async dispatch => {
  const asyncResp = await loginApi(user)
  dispatch(
    updateUser({
      loggedIn: asyncResp.isloggedIn,
      userName: user.userName,
      userPwd: user.userPwd
    })
  )
}

Как говорится в официальном документе, я отправляю такое действие, и здесь нет проблем.

// app.tsx

import { updateUser } from '../store/action'

interface Props {
  updateUser: typeof updateUser
}

interface State {
  userName: string
  userPwd: string
}

class AppComponent extends React.Component<Props, State> {
  handleSubmit = () => {
    this.props.updateUser({
      userName: this.state.userName,
      userPwd: this.state.userPwd
    })
  }

  render(){
    return(
      <TextInput
        style = {style.userTextInput}
        value = {this.state.userName}
        onChangeText = {(userName) => this.setState({ userName })}
        placeholder = "input userName"
      />
      <TextInput
        style = {style.userTextInput}
        value = {this.state.userPwd}
        placeholder = "input user password"
        secureTextEntry = {true}
        onChangeText = {(userPwd) => this.setState({ userPwd })}
      />
      <TouchableOpacity
        style = {style.loginBotton}
        onPress = {this.handleSubmit}
      >
        <Text style = {style.loginBottomText}>LOGIN</Text>
      </TouchableOpacity>
    )
  }
}

export default connect(
  (state: AppState) => ({
    user: state.user
  }),
  { updateUser }
)(AppComponent)

updateUser — это простое действие, подобное этому.

// store/user/action.ts

import { UserState, UPDATE_USER } from './types'

export function updateUser(newUser: UserState) {
  return {
    type: UPDATE_USER,
    payload: newUser
  }
}

Но когда я заменяю updateUser на thunkLogin, появляется сообщение об ошибке, показывающее, что его нельзя назначить для реквизита.

...

interface Props {
  thunkLogin: typeof thunkLogin
}

...

handleSubmit = () => {
  this.props.thunkLogin({
    userName: this.state.userName,
    userPwd: this.state.userPwd
  })
}

...

export default connect(
  (state: AppState) => ({
    user: state.user
  }),
  { thunkLogin }
)(AppComponent)

ОБНОВИТЬ Отчет об ошибке

Argument of type 'typeof AppComponent' is not assignable to parameter of type 'ComponentType<Matching<{ user: UserState; } & { thunkLogin: (user: UserState) => void; }, Props>>'.
  Type 'typeof AppComponent' is not assignable to type 'ComponentClass<Matching<{ user: UserState; } & { thunkLogin: (user: UserState) => void; }, Props>, any>'.
    Types of parameters 'props' and 'props' are incompatible.
      Type 'Matching<{ user: UserState; } & { thunkLogin: (user: UserState) => void; }, Props>' is not assignable to type 'Props'.
        Types of property 'thunkLogin' are incompatible.
          Type '(user: UserState) => void' is not assignable to type '(user: UserState) => ThunkAction<void, { user: UserState; login: LoginState; }, null, Action<string>>'.
            Type 'void' is not assignable to type 'ThunkAction<void, { user: UserState; login: LoginState; }, null, Action<string>>'. [2345]

interface Props { thunkLogin: ThunkAction<void, AppState, null, Action<string>> }
bamtheboozle 01.04.2019 12:41

typeof thunkLogin такое же, как ThunkAction<void, AppState, null, Action<string>>

ccd 01.04.2019 13:36

это не так, typeof thunkLogin — это функция

bamtheboozle 01.04.2019 13:44

Я добавляю тип, который вы советуете, но получаю тот же результат.

ccd 01.04.2019 17:58

@yuanlai Пожалуйста, сообщите нам точное сообщение об ошибке.

10101010 02.04.2019 10:00

Я обновляю отчет об ошибке выше

ccd 02.04.2019 17:52

Что сделал props.updateUser? Отправил ли он действие, т.е. что-то произошло в редюсере? Похоже, он возвращает объект.

10101010 04.04.2019 16:51

@yuanlai Вы решили проблему? у меня есть похожий

Jefski14 22.07.2019 15:27
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
4
8
2 848
0

Другие вопросы по теме