如何打字更简洁

How to type less verbosely

我想知道是否可以以更简洁的方式键入 handleSubmit。也许通过放置 eventDefault 创建一个新界面。我该怎么做?

  import {Project} from "../ProjectsPage/Project";

interface FormTypeProps {
    onCancel: () => void;
    onSave: (project: Project) => void;
}

export function ProjectForm({onCancel, onSave}: FormTypeProps) {
    const handleSubmit = (event: { preventDefault: () => void; }) => {
        event.preventDefault()
        onSave(new Project({name: 'Update Project'}))
    }


    return (
        <form className="input-group vertical" onSubmit={handleSubmit}>
            <label htmlFor="name">Project Name</label>
            <input type="text" name="name" placeholder="enter name"/>
            <label htmlFor="description">Project Description</label>
            <textarea name="description" placeholder="enter description"/>
            <label htmlFor="budget">Project Budget</label>
            <input type="number" name="budget" placeholder="enter budget"/>
            <label htmlFor="isActive">Active?</label>
            <input type="checkbox" name="isActive"/>
            <div className="input-group">
                <button className="primary bordered medium">Save</button>
                <span/>
                <button type="button" className="bordered medium" onClick={onCancel}>
                    Cancel
                </button>
            </div>
        </form>
    )
}

您可以将类型分配给函数本身或函数的参数,即事件。


React.FormEventHandler<HTMLFormElement>

这是函数的类型。如果你这样使用它:

handleSubmit: React.FormEventHandler<HTMLFormElement> = e => {
}

然后变量 e 的类型将被自动推断为 React.FormEvent。所以您实际上不需要知道事件类型,因为您可以将类型应用于函数本身并获得正确的类型。


或者您可以将类型分配给事件参数 e。

handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
}

现在 handleSubmit 属性 的类型被推断为 (e: React.FormEvent<HTMLFormElement>) => void.

您可以使用 React.FormEvent 作为 event 参数的类型:

import React, { FormEvent } from "react";

// ...

const handleSubmit = (event: FormEvent) => {
    event.preventDefault();
    // ...
};

React 对各种事件都有自己的合成事件类型,您可以在按照自己的方式设置处理程序时使用它,在元素上使用 onXyz 属性。 (当通过 addEventListener 设置处理程序时,这有时仍然是必要的,重要的是 而不是 使用 React 的合成事件类型,因为您没有设置 React 事件处理程序,您正在设置一个 DOM 事件处理程序。但是按照您的操作方式,您需要合成类型。)

可以将函数本身键入 FormEventHandler<HTMLFormElement>:

import React, { FormEvent } from "react";

// ...

const handleSubmit: FormEventHandler = (event) => {
    event.preventDefault();
    // ...
};

请注意,FormEventFormEventHandler 都是通用类型,接受 target 将成为的元素类型的类型参数。默认值为 Element,这通常就足够了,但如果您想更彻底,您也可以提供 HTMLFormElement(例如,FormEvent<HTMLFormElement>)。