useParams dans TypeScript ne permet pas la déstructuration

Oct 25 2020

Je suivais cette vidéo ("JWTUser Sessions with ReactJS & GraphQL ...") quand à ce moment, la useParams()méthode guy destructures de la bibliothèque react -router-dom .

Dans mon cas, cela n'a pas fonctionné car j'obtiens cette erreur:

C'est tout le code à ce stade:

import React, { useState, useContext } from 'react';
import { useParams, useHistory } from 'react-router-dom';
import { useConfirmMutation } from '../gql/generated/graphql';
import { AppStateContext } from './provider';

export const Confirm: React.FC = () => {
    const history = useHistory();
    const { appSetAuthToken, appClearAuthToken, gqlError } = useContext(AppStateContext);

    const [show, setShow] = useState(false);
    const [email, setEmail] = useState('');
    const [confirm] = useConfirmMutation();
    const { token } = useParams();

    const handleFormSubmit = async (e: React.FormEvent) => {
        e.preventDefault();

        try {
            setShow(false);
            appSetAuthToken(token);
            const { data } = await confirm({ variables: email });
        } catch {

        }
    };

    if (token === undefined || token === '')
        return <div>Enlace de confirmación de usuario inválido</div>;

    return (
        <div>
            <div>Página de confirmación de usuario</div>
            {show ? <div>{gqlError.msg}</div> : undefined}
            <form>
                <div>
                    <input
                        value={email}
                        placeholder='Correo electrónico'
                        type='email'
                        onChange={e => { setEmail(e.target.value); }}
                    />
                </div>
                <button type='submit'>Confirmar</button>
            </form>
        </div>
    );
};

J'ai également essayé la même chose sur CodeSandbox mais cela fonctionne. Je ne sais pas, où est mon erreur. Pouvez-vous voir cette erreur?

Réponses

7 LindaPaiste Oct 25 2020 at 04:16

useParamsest générique. Vous devez indiquer au typographe quels paramètres vous utilisez en spécifiant la valeur du générique comme ceci useParams<MyParams>():; Dans votre cas c'est:

const { token } = useParams<{token?: string}>();

Ce qui dit que tokenc'est soit un stringsoit undefined.