reactjs - HTMLFormElement null kan inte tilldelas en parameter av typen string | Typescript | EmailJS
React Typescript förhindrar mig från att kunna använda boilerplate-koden från emailJS.
Jag har modifierat mallkoden för att åtgärda ett fel på UseRef() och const sendEmail.
Jag får felet på form.current-raden i funktionen sendForm().
Fel: (egenskap) React.RefObject.current: HTMLFormElement | null
Argument av typen 'HTMLFormElement | null' kan inte tilldelas parametern av typen 'string | HTMLFormElement'. Typen 'null' kan inte tilldelas typen 'string | HTMLFormElement'.ts(2345)
import React, { useRef } from 'react';
import emailjs from '@emailjs/browser';
export const ContactUs = () => {
const form = useRef<HTMLFormElement>(null);
const sendEmail = (e) => {
e.preventDefault();
emailjs.sendForm('YOUR_SERVICE_ID', 'YOUR_TEMPLATE_ID', form.current, 'YOUR_PUBLIC_KEY')
.then((result) => {
console.log(result.text);
}, (error) => {
console.log(error.text);
});
};
return (
<form ref={form} onSubmit={sendEmail}>
<label>Name</label>
<input type="text" name="user_name" />
<label>Email</label>
<input type="email" name="user_email" />
<label>Message</label>
<textarea name="message" />
<input type="submit" value="Send" />
</form>
);
};
Svar #1
Den här typen av fel är anledningen till att jag älskar TypeScript ;)
Kompilatorn är tillräckligt smart för att förstå att form.current kan innehålla ett formulär, eller det kan vara null, så det är typat som HTMLFormElement | null.
I din sendEmail-funktion tar du inte hänsyn till detta fall på något sätt, så kompilatorn skriker och gnäller och har helt rätt!
Du måste ta hänsyn till fallet där form.current är null:
const sendEmail = (e) => {
e.preventDefault();
const currentForm = form.current;
// this prevents sending emails if there is no form.
// in case currentForm cannot possibly ever be null,
// you could alert the user or throw an Error, here
if (currentForm == null) return;
// the compiler is smart enough to know that currentForm here is of type HTMLFormElement
emailjs.sendForm('YOUR_SERVICE_ID', 'YOUR_TEMPLATE_ID', currentForm, 'YOUR_PUBLIC_KEY')
.then((result) => {
console.log(result.text);
}, (error) => {
console.log(error.text);
});
};
