ค้นหาเว็บไซต์

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 จึงไม่อนุญาต

มีสามวิธีในการจัดการกับเรื่องนี้:

  1. ตรวจสอบกับมันอย่างชัดเจน บางอย่างเช่น if (req.apiGateway === undefined) { throw new badRequestException(); }
  2. ถ้าคุณ มั่นใจ ว่ามันไม่สามารถเป็น undefined ได้ คุณสามารถบังคับให้ TypeScript ยอมรับมันได้ เขียน req.apiGateway!.event ระวังนะ ถ้า apiGateway บังเอิญเป็น undefined ในขณะรันไทม์ คุณจะได้ข้อยกเว้น ดังนั้นใช้วิธีนี้เฉพาะเมื่อคุณมั่นใจ 100% ว่ามันไม่สามารถเป็น undefined ภายใต้สถานการณ์ใด ๆ
  3. ยอมรับว่ามันสามารถเป็นค่า 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