javascript - อาร์กิวเมนต์ประเภท 'string | undefined' ไม่สามารถกำหนดค่าให้กับพารามิเตอร์ประเภท 'string' ได้ - ข้อผิดพลาด TypeScript
ข้อผิดพลาด TS "วัตถุไม่ถูกกำหนด"
กำลังพยายามเข้าถึง "userid" จากหัวข้อของฉัน
มันยังคงแสดงข้อผิดพลาด "Argument of type 'string | undefined' ไม่สามารถกำหนดค่าให้กับพารามิเตอร์ประเภท 'string' ได้ ประเภท 'undefined' ไม่สามารถกำหนดค่าให้กับประเภท 'string' ได้"
เมื่อฉันได้กำหนด userid เป็น string หรือ undefined แล้ว ทำไมถึงเกิดข้อผิดพลาดนี้ขึ้น??
มีใครมีไอเดียไหม????
อัปเดต:
เพิ่มการตรวจสอบก่อนเข้าถึงเหตุการณ์ apiGateway
if (apiGateway.event !== undefined) {
const { userid } = req.apiGateway.event.headers;
} else {
throw new badRequestException()
}
return......
คำตอบ #1
พิจารณาตามคำนิยามของคุณเกี่ยวกับ MyRequest:
apiGatewayสามารถ ไม่ถูกกำหนดค่าeventไม่สามารถเป็นค่าที่ไม่กำหนดได้headersไม่สามารถเป็นค่าที่ไม่กำหนดได้useridสามารถ ไม่ได้ถูกกำหนด
ดังนั้นทันทีที่เริ่มต้น การเขียน req.apiGateway.event.headers จะล้มเหลว เพราะถ้า apiGateway เป็น undefined การเข้าถึง .event บนมันจะทำให้เกิดข้อผิดพลาด ดังนั้น Typescript จึงไม่อนุญาต
มีสามวิธีในการจัดการกับเรื่องนี้:
- ตรวจสอบกับมันอย่างชัดเจน บางอย่างเช่น
if (req.apiGateway === undefined) { throw new badRequestException(); } - ถ้าคุณ มั่นใจ ว่ามันไม่สามารถเป็น
undefinedได้ คุณสามารถบังคับให้ TypeScript ยอมรับมันได้ เขียนreq.apiGateway!.eventระวังนะ ถ้าapiGatewayบังเอิญเป็น undefined ในขณะรันไทม์ คุณจะได้ข้อยกเว้น ดังนั้นใช้วิธีนี้เฉพาะเมื่อคุณมั่นใจ 100% ว่ามันไม่สามารถเป็น undefined ภายใต้สถานการณ์ใด ๆ - ยอมรับว่ามันสามารถเป็นค่า undefined และบังคับให้ทุกอย่างอื่นเป็น undefined ด้วยเช่นกัน เขียน
req.apiGateway?.event- ในกรณีนี้.eventก็จะถือว่าสามารถเป็น undefined ได้เช่นกัน หากreq.apiGatewayเป็น undefined ในระหว่างรันไทม์ ดังนั้นreq.apiGateway?.eventก็จะเป็น undefined ด้วย และต่อไปเรื่อย ๆ นั่นหมายความว่าคุณก็จะต้องเพิ่ม?.ให้กับส่วนที่เหลือของบรรทัด:req.apiGateway?.event?.headersและผลลัพธ์ของนิพจน์ทั้งหมดก็สามารถเป็น undefined ได้เช่นกัน ดังนั้นคุณอาจจำเป็นต้องใช้การตรวจสอบ undefined เพิ่มเติมในภายหลัง
ตอนนี้ สำหรับปัญหาที่สองของคุณ ขณะนี้ตัวแปรท้องถิ่น userid ของคุณมีชนิดเป็น string|undefined นั่นเป็นเพราะว่า req.apiGateway.event.headers.userid เป็น string|undefined ซึ่งหมายความว่าในเวลารันไทม์ มันสามารถเป็นได้ทั้งสตริง หรือ undefined อย่างไรก็ตาม เมธอด updateNotification() คาดหวังพารามิเตอร์ที่เป็น string ธรรมดา มันไม่สามารถจัดการกับค่า undefined ได้ หากคุณส่ง undefined ไป ไม่รู้ว่าจะเกิดอะไรขึ้น (มีโอกาสเกิด exception) ดังนั้น Typescript จึงไม่อนุญาต และอีกครั้ง คุณสามารถใช้วิธีข้างต้นในการจัดการกับมัน
คำตอบ #2
เสมอเมื่อตอนที่คุณเจอข้อผิดพลาดนี้ จะดีที่จะตรวจสอบว่าตัวแปรมีค่าหรือไม่:
if(!variable) return
// continue
หลังจากนี้ ถ้าชนิดของตัวแปรจะเป็น string แทนที่จะเป็น string | undefined

