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

node.js - ประเภท request.url เป็น undefined ทำไม?


ทำไม request.url ถึงถูกกำหนดว่าเป็นค่าไม่บังคับภายในประเภทของ nodejs? หากมี Request มาถึงเซิร์ฟเวอร์ http ควรมี url ตามคำนิยามอยู่แล้ว

ทำไมถึงมีเครื่องหมายคำถามอยู่ตรงนี้? url?: string;

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/node/http.d.ts#L288

คำตอบ #1

ฉันไม่ค่อยรู้เกี่ยวกับ http/Request ใน node เท่าไหร่ แต่สิ่งนี้ดูเหมือนจะเป็นตัวอย่างคลาสสิกของการออกแบบแบบไม่ดี (ซึ่งมักพบในคำนิยาม @types/node ไม่ว่าจะเป็นเพราะวิธีการเขียนประเภทเหล่านั้นหรือการออกแบบพื้นฐานของ API node.js เอง)

IncomingMessage ถูกสร้างแบบเป็นชนิดผลิตภัณฑ์ที่มีคีย์ที่เป็นตัวเลือกแทนที่จะเป็นชนิดผลรวมที่ถูกต้อง - เพื่อแยกกรณีของคำขอจากลูกค้าจากคำขอที่สร้างโดยเซิร์ฟเวอร์ ความคิดเห็นเกี่ยวกับค่าคงที่จึงถูกวางไว้เหนือฟีลด์เดียว ทำให้ไม่เป็นประโยชน์ในแง่ของการตรวจสอบประเภทแบบสถิติโดย TS

เพียงแค่การอ่านคำนิยามนั้น คำจำกัดความของชนิดที่ดีกว่าอาจจะเป็น:

interface ClientIncomingMessage extends stream.Readable {
  // ... many other fields ...
  url: string;
}

interface ServerIncomingMessage extends stream.Readable {
  // ... many other fields ...
  // no `url` fields here!
}

type IncomingMessage = ClientIncomingMessage | ServerIncomingMessage