programing

'TS2532: Object is undefined' 오류를 해결하려면 어떻게 해야 합니까?

codeshow 2023. 2. 26. 10:19
반응형

'TS2532: Object is undefined' 오류를 해결하려면 어떻게 해야 합니까?

Firebase Cloud Functions와 Firestore를 사용하는 웹 앱의 예를 재구축하려고 합니다.기능을 전개하면, 다음의 에러가 표시됩니다.

src/index.ts:45:18 - error TS2532: Object is possibly 'undefined'.
45     const data = change.after.data();

기능은 다음과 같습니다.

export const archiveChat = functions.firestore
  .document("chats/{chatId}")
  .onUpdate(change => {
    const data = change.after.data();

    const maxLen = 100;
    const msgLen = data.messages.length;
    const charLen = JSON.stringify(data).length;

    const batch = db.batch();

    if (charLen >= 10000 || msgLen >= maxLen) {

      // Always delete at least 1 message
      const deleteCount = msgLen - maxLen <= 0 ? 1 : msgLen - maxLen
      data.messages.splice(0, deleteCount);

      const ref = db.collection("chats").doc(change.after.id);

      batch.set(ref, data, { merge: true });

      return batch.commit();
    } else {
      return null;
    }
  });

테스트하기 위해 기능을 사용하려는 것뿐입니다.그리고 이미 웹에서 비슷한 문제를 검색했지만, 제 문제와 일치하는 다른 게시물을 찾을 수 없었습니다.

TypeScript 3.7 릴리즈에서는 옵션 체인을 통해?이제 오퍼레이터)를 공식적으로 사용할 수 있습니다.

따라서 표현식을 다음과 같이 단순화할 수 있습니다.

const data = change?.after?.data();

이 버전에 대한 자세한 내용은 해당 버전에서 출시된 다른 흥미로운 기능에 대한 릴리스 노트를 참조하십시오.

다음을 수행하여 TypeScript의 안정적인 최신 릴리스를 설치합니다.

npm install typescript

, 옵션 체인은 Nullish Coalescing과 함께 사용하여 처리 시 폴백 값을 제공할 수 있습니다.null또는undefined가치

const data = change?.after?.data() ?? someOtherData();

추가 사항:

조건부 옵션 체인을 사용하는 경우if올바른 값/유형 균등성 검사를 수행하고 있는지 확인해야 합니다.

정의되지 않은 값을 숫자와 비교하고 있을 가능성이 있기 때문에 엄밀한 TypeScript에서는 다음 작업이 실패합니다.

if (_?.childs?.length > 0) 

대신 다음과 같이 해야 합니다.

if (_?.childs && _.childs.length > 0) 

편집/갱신:

Typescript 3.7 이후를 사용하고 있는 경우는, 다음의 조작도 가능합니다.

    const data = change?.after?.data();

    if(!data) {
      console.error('No data here!');
       return null
    }

    const maxLen = 100;
    const msgLen = data.messages.length;
    const charLen = JSON.stringify(data).length;

    const batch = db.batch();

    if (charLen >= 10000 || msgLen >= maxLen) {

      // Always delete at least 1 message
      const deleteCount = msgLen - maxLen <= 0 ? 1 : msgLen - maxLen
      data.messages.splice(0, deleteCount);

      const ref = db.collection("chats").doc(change.after.id);

      batch.set(ref, data, { merge: true });

      return batch.commit();
    } else {
      return null;
    }

원래의 응답

타이프스크립트에 의하면change또는data가능성이 있다undefined(무엇에 따라 다름)onUpdate반품).

따라서 null/정의되지 않은 체크로 랩해야 합니다.

if(change && change.after && change.after.data){
    const data = change.after.data();

    const maxLen = 100;
    const msgLen = data.messages.length;
    const charLen = JSON.stringify(data).length;

    const batch = db.batch();

    if (charLen >= 10000 || msgLen >= maxLen) {

      // Always delete at least 1 message
      const deleteCount = msgLen - maxLen <= 0 ? 1 : msgLen - maxLen
      data.messages.splice(0, deleteCount);

      const ref = db.collection("chats").doc(change.after.id);

      batch.set(ref, data, { merge: true });

      return batch.commit();
    } else {
      return null;
    }
}

만약 당신이 100% 확신한다면object항상 정의되어 있는 경우는, 다음과 같이 지정할 수 있습니다.

const data = change.after!.data();

특정 오브젝트 속성이 null일 수 없는 경우 해당 아이템 뒤에 null이 아닌 어설션 연산자(!)를 사용할 수 있습니다.제 암호는 이렇습니다.

  const naciStatus = dataToSend.naci?.statusNACI;
  if (typeof naciStatus != "undefined") {
    switch (naciStatus) {
      case "AP":
        dataToSend.naci.certificateStatus = "FALSE";
        break;
      case "AS":
      case "WR":
        dataToSend.naci.certificateStatus = "TRUE";
        break;
      default:
        dataToSend.naci.certificateStatus = "";
    }
  }

그리고 왜냐하면dataToSend.naciswitch 스테이트먼트에서는 정의할 수 없습니다.코드는 다음과 같이 느낌표를 포함하도록 갱신할 수 있습니다.

  const naciStatus = dataToSend.naci?.statusNACI;
  if (typeof naciStatus != "undefined") {
    switch (naciStatus) {
      case "AP":
        dataToSend.naci!.certificateStatus = "FALSE";
        break;
      case "AS":
      case "WR":
        dataToSend.naci!.certificateStatus = "TRUE";
        break;
      default:
        dataToSend.naci!.certificateStatus = "";
    }
  }

const data = 변경!after!.data();

문제를 해결하는 또 다른 방법은 다음과 같습니다.

const data = change!.after!.data();

단, eslint를 사용하면 다음 오류가 발생할 수 있습니다.

금지된 null 이외의 어설션입니다.(eslint@typescript-eslint/no-non-typledge-script)

다음과 같이 에러를 디세블로 할 수 있습니다.

// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const data = change!.after!.data();

단, 이 방법을 따르는 것은 권장하지 않습니다.eslint 설정을 변경하거나 매뉴얼에 기재되어 있는 대로 수정하는 것이 좋습니다.

const data = change?.after?.data();

언급URL : https://stackoverflow.com/questions/54884488/how-can-i-solve-the-error-ts2532-object-is-possibly-undefined

반응형