TypeError: не удается уничтожить свойство ‘text’ ‘props.message’, поскольку оно не определено

#javascript #reactjs #typescript #firebase

# #javascript #reactjs #typescript #firebase

Вопрос:

Я получаю ошибку типа в моей функции ChatMessage.

Я пробовал несколько разных решений, ни одно из которых не относится к этому конкретному сценарию. Это приложение для чата Firebase, очевидно, не уникальное, но я пытаюсь интегрировать в него TypeScript, все еще изучая и надеясь найти решение, из которого я смогу узнать больше.

App.tsx — это ядро кода

 import './App.css';

import firebase from 'firebase/app';
import 'firebase/firestore';
import 'firebase/auth';

import { useAuthState } from 'react-firebase-hooks/auth';
import { useCollectionData } from 'react-firebase-hooks/firestore';

firebase.initializeApp ({
    //Removed on stackoverflow for security reasons
})

const auth = firebase.auth();
const firestore = firebase.firestore();

function App() {
  const [user] = useAuthState(auth);

  return (
    <div className="App">
      <header>
        <h1>⚛️🔥💬</h1>
        <SignOut />
      </header>

      <section>
        {user ? <ChatRoom /> : <SignIn />}
      </section>
    </div>
  );
}

function SignIn() {
  const signInWithGoogle = () => {
    const provider = new firebase.auth.GoogleAuthProvider();
    auth.signInWithPopup(provider);
  }

  return (
    <>
    <button onClick={signInWithGoogle}>Sign in with Google</button>
    <p>Do not violate the community guidelines or you will be banned for life!</p>
    </>
  )
}

function SignOut() {
  return auth.currentUser amp;amp; (
    <button className="sign-out" onClick={() => auth.signOut()}></button>
  )
}

function ChatRoom() {
  const dummy = useRef<HTMLDivElement>(null);

  const messagesRef = firestore.collection('messages');
  const query = messagesRef.orderBy('createdAt').limit(25);

  const [messages] = useCollectionData(query, {idField: 'id'});

  const [formValue, setFormValue] = useState('');

  const sendMessage = async(e : any) => {
    e.preventDefault();

    const user = auth.currentUser;

    if (user) {
      const { uid, photoURL } = user;

      await messagesRef.add ({
        text: formValue,
        createdAt: firebase.firestore.FieldValue.serverTimestamp(),
        uid,
        photoURL
      });

      setFormValue('');
      dummy.current!.scrollIntoView({ behavior: 'smooth' });
      
    } else {
      //Handle Errors
    }
  };

  return (
    <>
      <main>
        {messages amp;amp; messages.map((msg: any) => <ChatMessage key={msg.id} messsage={msg}/>)}

        <span ref={dummy}></span>
      </main>

      <form onSubmit={sendMessage}>
        <input value={formValue} onChange={(e) => setFormValue(e.target.value)} placeholder="Send Message..."/>
        <button type="submit" disabled={!formValue}>🕊️</button>
      </form>
    </>
  )
}

function ChatMessage(props: any) {
  const { text, uid, photoURL } = props.message;

  const messageClass = uid === auth.currentUser?.uid ? 'sent' : 'received';

  return (
    <>
    <div className={`message ${messageClass}`}>
      <img src={photoURL || 'https://api.hello-avatar.com/adorables/myseed'} />
      <p>{text}</p>
    </div>
    </>
  )
}

export default App;
 

Функция ChatMessage — функция, в которой возникает ошибка (TypeScript не улавливает эту проблему, она возникает только после сборки)

 function ChatMessage(props: any) {
  const { text, uid, photoURL } = props.message;

  const messageClass = uid === auth.currentUser?.uid ? 'sent' : 'received';

  return (
    <>
    <div className={`message ${messageClass}`}>
      <img src={photoURL || 'https://api.hello-avatar.com/adorables/myseed'} />
      <p>{text}</p>
    </div>
    </>
  )
}
 

Ошибка — конкретная ошибка в функции ChatMessage

 TypeError: Cannot destructure property 'text' of 'props.message' as it is undefined.
 

Редактировать 1 — Я полагаю, что ошибка объясняет, что свойство «text» из «props.message» не определено, хотя его тип «любой». Нужно ли мне снова определять это для определенного типа?

Редактировать 2: Решение — в моем скрипте была опечатка. Сообщение было написано «Messsage». Всем спасибо за помощь!

Ответ №1:

Проблема здесь в том, что вы используете деструктурирование, например

 const {foo} = bar
 

ожидается, что объект bar будет таким, что он состоит из foo поля:

    const bar = {
     foo: ''
  }
 

В вашем случае ваш props.messages объект, похоже, не содержит text поля, поэтому вы получаете сообщение об ошибке

Ответ №2:

Проблема связана с опечаткой. <ChatMessage key={msg.id} messsage={msg}/>

Это сообщение вместо сообщения. Поэтому, когда вы пытаетесь выполнить деструкцию, оно не найдет свойство message в props.

Комментарии:

1. Да, всегда! Совет профессионала — используйте консоль. регистрируйте, если вы получаете такие ошибки, и отлаживайте их самостоятельно. Это значительно сэкономит ваше время.