'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.naci
switch 스테이트먼트에서는 정의할 수 없습니다.코드는 다음과 같이 느낌표를 포함하도록 갱신할 수 있습니다.
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
'programing' 카테고리의 다른 글
JSON 문자열을 C# 객체로 변환 (0) | 2023.02.26 |
---|---|
Oracle jdbc 드라이버 클래스의 차이점 (0) | 2023.02.26 |
그래들 잡으러요Spring Boot에 빌드 버전 (0) | 2023.02.26 |
JSON에 대한 PDOStainment (0) | 2023.02.26 |
MongoDB의 정확한 요소 배열 필드 업데이트 (0) | 2023.02.26 |