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
