Я использую мутацию graphql:
interface SignInReponse {
loginEmail : {
accessToken: number;
}
}
const [login] = useMutation<SignInReponse>(LOGIN);
let submitForm = (email: string, password: string) => {
setIsSubmitted(true);
login({
variables: {
email: email,
password: password,
},
})
.then(({ data }: ExecutionResult<SignInReponse>) => {
if (data !== null && data !== undefined){
dispatch({ type: "login", payload: data.loginEmail.accessToken })
setTimeout(_ => {
setShouldRedirect(true);
}, 2000)
setIsLoggedIn(true);
}})
Мой идентификатор входа в систему:
const initialState = {
token: null
};
export const loginReducer = (state = initialState, { type, payload } :any) => {
switch (type) {
case "login":
return {...state, token: payload};
default:
return state;
}
};
Я хочу изменить any
тип данных в { type, payload } :any
и быть более точным c.
Однако я не понимаю, как правильно найти / использовать правильный тип данных. Я уже пробовал использовать SignInResponse, но это не работает, так как тип / полезная нагрузка в нем не упоминаются.
РЕДАКТИРОВАТЬ:
Я также пробовал это:
export const loginReducer = (state = initialState, { type, payload }: {type: "login", payload: string })
но это не похоже на работу.
TypeScript error in /helpers/privateRouting.tsx(7,32):
Property 'token' does not exist on type 'never'. TS2339
Я изменил такие вещи, но все равно выдает ошибку:
actions / login.ts:
const LOGIN = 'LOGIN'
export interface LoginAction {
type: typeof LOGIN
payload: string;
}
allActions.ts:
import { LoginAction } from './login';
export type AnyAction = LoginAction
Редуктор входа в систему:
const initialState = {
token: null
};
export const loginReducer = (state = initialState, action: AnyAction) => {
switch (action.type) {
case 'LOGIN':
return {...state, token: action.payload};
default:
return state;
}
};
Редуктор index.ts:
export const rootReducer = combineReducers({
login: loginReducer,
});
PrivateRouting:
export const PrivateRoute = ({ component, ...rest }: any) => {
const routeComponent = (props: any) => {
if (store.getState().login.token) {
return React.createElement(component, props);
} else {
return <Redirect to={{ pathname: '/404' }} />;
}
};
return <Route {...rest} render={routeComponent} />;
};
Ошибка:
Property 'token' does not exist on type 'never'. TS2339
5 | export const PrivateRoute = ({ component, ...rest }: any) => {
6 | const routeComponent = (props: any) => {
> 7 | if (store.getState().login.token) {
Store index.ts:
const persistConfig = {
key: 'root',
storage
}
const persistedReducer = persistReducer(persistConfig, rootReducer)
let store = createStore(persistedReducer);
let persistor = persistStore(store);
export { store, persistor };
Я использую privateRoutes, как это:
export default function App() {
return (
<Provider store={store}>
<PersistGate persistor={persistor}>
<div>
<BrowserRouter>
<Switch>
<Route path="/login" component={LoginPage}></Route>
<Route path="/404" component={Error404Page}></Route>
<PrivateRoute
path="/add"
component={AddUserPage}
/>
<Redirect from="*" to="/404" />
</Switch>
</BrowserRouter>
</div>
</PersistGate>
</Provider>
);
}