Website-Suche

reactjs - Ant Design onFinish-Funktion mit TypeScript; Typ '(values: FormData) => void' ist nicht zuweisbar zu Typ '(values: unknown) => void'


Ich habe das Interface FormData, das denselben Typ wie die Werte haben soll, die die onFinish-Funktion erhält, aber wenn ich es einfüge

const onFinish = (values: FormData) => {

Ich erhalte den Fehler Type '(values: FormData) => void' is not assignable to type '(values: unknown) => void'. Ich habe versucht, die Daten zu fälschen und dasselbe Objekt zu erstellen, das die onFinish-Funktion erhält, wenn ich das Formular absende:

interface FormData {
    firstName: string;
    lastName: string;
    username: string;
    password: string;
    confirmPassword: string;
}

const obj: FormData = {
    firstName: 'andrija',
    lastName: 'gajic',
    username: 'radojica51',
    password: 'idegas51',
    confirmPassword: 'idegas51'
}

Wenn man es auf diese Weise macht, tritt kein Fehler auf, obwohl es dieselben Daten sind, die das Formular erhält

import axios from 'axios';

import { Form, FormCaption } from './Form.style';
import { Input, Button } from 'antd';

interface FormData {
    firstName: string;
    lastName: string;
    username: string;
    password: string;
    confirmPassword: string;
}

const FormComponent = () => {

    // change values type to FormData
    const onFinish = (values: any) => {
        if (values.password !== values.confirmPassword) {
            message.error('Passwords don\'t match!');
            return;
        }
        console.log(values);

        axios.post('http://localhost:5000/register', values);
    }

    return (
        <Form onFinish={onFinish}>
            <FormCaption>Register</FormCaption>

            <FormElement.Item
                label="First name"
                name="firstName"
                rules={[
                    {
                        required: true,
                        message: 'Please enter your first name!',
                    },
                ]}
            >
                <Input />
            </FormElement.Item>

            <FormElement.Item
                label="Last name"
                name="lastName"
                rules={[
                    {
                        required: true,
                        message: 'Please enter your last name!',
                    },
                ]}
            >
                <Input />
            </FormElement.Item>

            <FormElement.Item
                label="Username"
                name="username"
                rules={[
                    {
                        required: true,
                        message: 'Please enter the username!',
                    },
                    {
                        min: 6,
                        max: 20,
                        message: 'Must be between 6 and 20 characters'
                    }
                ]}
            >
                <Input />
            </FormElement.Item>

            <FormElement.Item
                label="Password"
                name="password"
                rules={[
                    {
                        required: true,
                        message: 'Please enter the password!',
                    },
                    {
                        min: 6,
                        max: 20,
                        message: 'Must be between 6 and 20 characters'
                    }
                ]}
            >
                <Input.Password />
            </FormElement.Item>

            <FormElement.Item
                label="Confirm Password"
                name="confirmPassword"
                rules={[
                    {
                        required: true,
                        message: 'Please confirm your password!',
                    },
                    {
                        min: 6,
                        max: 20,
                        message: 'Must be between 6 and 20 characters'
                    }
                ]}
            >
                <Input.Password />
            </FormElement.Item>
   
            <Button htmlType="submit">Register</Button>
        </Form>
  )
}

export default FormComponent;

Antwort #1

Ich persönlich schreibe jsx nicht gerne so, aber Sie können den erwarteten Formular-Typ wie folgt übergeben:

import { Form } from 'antd';
// ...

const FormComponent = () => {
  // ...
  const onFinish = (values: FormData) => {
    // ...
  }
  
  return (
    <Form<FormData> onFinish={onFinish}>
    // ...

Jetzt wird onFinish nicht meckern und die richtigen Typen haben. Quelle

Antwort #2

Sie können den unten stehenden Code verwenden, um damit umzugehen

const onFinish = (values: FormData) => { }; 

und verwende unten in onFinish

<Form onFinish={(values)=> onFinish(values as FormData)}>
    ....
</Form>

Lerne mehr über das Schlüsselwort hier

  • Was macht das Schlüsselwort „as“?
  • https://www.typescriptlang.org/docs/handbook/advanced-types.html

Verwandte Artikel