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

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 สำหรับการหาที่มานั้น