javascript - ทำไม interface ของ Redux.js "Dispatch" ใน TypeScript ถึงมีพารามิเตอร์เทมเพลต?
บรรทัดที่เกี่ยวข้อง
ถ้าหน้าตาอินเทอร์เฟซเป็นดังนี้:
export interface Dispatch<S> {
<A extends Action>(action: A): A;
}
...และ S ชัดเจนว่าไม่ได้ถูกใช้ แล้วทำไมมันถึงอยู่ที่นั่น?
ฉันสังเกตว่า S ถูกใช้ที่อื่นสำหรับสิ่งที่เกี่ยวข้องกับ "ร้านค้า" แต่ถ้ามันไม่ได้ถูกใช้ในอินเตอร์เฟซนี้ ฉันคิดว่ามันไม่ควรอยู่ตรงนั้น
คำตอบ #1
คุณพูดถูก เมื่ออยู่ตัวมันเอง มันดูเหมือนไม่ค่อยสมเหตุสมผลเท่าไหร่
ฉันเดาว่าพวกเขาทำแบบนั้นเพื่อให้แน่ใจว่าฟังก์ชันการส่งถูกส่งกลับในมิดเดิลแวร์
ในกรณีของมิดเดิลแวร์เช่น redux-thunk ฟังก์ชัน dispatch ใหม่จะใช้พารามิเตอร์ <S> แม้ว่าฉันจะไม่แน่ใจว่ามันจะสำคัญหรือไม่ถ้าฟังก์ชันเริ่มต้นไม่ได้ใช้ในกรณีนี้
คำตอบ #2
การมีพารามิเตอร์ประเภท state S ช่วยให้ middleware มีความแม่นยำมากขึ้นในเรื่องการพิมพ์ประเภท (typings) ตัวอย่างเช่น ฟังก์ชัน thunk จะรับ dispatch และ getState(): S ดังนั้นหากไม่มี S ก็ไม่สามารถพิมพ์ประเภทได้อย่างถูกต้อง ดูตัวอย่างด้านล่างนี้ได้ที่ https://github.com/Igorbek/redux/blob/ts-def-improv/test/typescript/dispatch.ts#L9-L16
แหล่งที่มา
เครดิตให้กับ @Lucas สำหรับการหาที่มานั้น