มี ArgumentsType เหมือน ReturnType ใน Typescript ไหม?
ReturnType<T> ดึงชนิดของค่าที่ฟังก์ชันส่งกลับ
มีวิธีในการกำหนด ArgumentsType<T> ที่ดึงชนิดพารามิเตอร์ของฟังก์ชันในรูปแบบ tuple หรือไม่?
ตัวอย่างเช่น,
`ArgumentsType<(a: number, b: string) => boolean>` จะเป็น `[number, string]`
คำตอบ #1
ไทป์สคริปต์ 3.1
ตั้งแต่เขียนคำตอบต้นฉบับ TypeScript ตอนนี้มีชนิดข้อมูลในตัว (กำหนดใน lib.d.ts) เพื่อรับชนิดของพารามิเตอร์ที่เรียกว่า Parameters
type argsEmpty = Parameters<() => void>
// []
type args = Parameters<(x: number, y: string, z: boolean) => void>
// [number, string, boolean]
type argsOpt = Parameters<(x: number, y?: string, z?: boolean) => void>
// [number, (string | undefined)?, (boolean | undefined)?]
คำตอบต้นฉบับ
แก้ไข Typescript 3.0 ได้ถูกปล่อยออกมา รหัสด้านล่างทำงานตามที่คาดไว้
แม้ว่านี่จะไม่สามารถทำได้ในเวอร์ชันปัจจุบันของ TypeScript (2.9) โดยไม่ต้องระบุพารามิเตอร์ทั้งหมด แต่มันจะสามารถทำได้ในเวอร์ชันต่อไปของ TypeScript (3.0) ซึ่งจะออกในไม่กี่วันข้างหน้า:
type ArgumentsType<T> = T extends (...args: infer U) => any ? U: never;
type argsEmpty = ArgumentsType<() => void>
// []
type args = ArgumentsType<(x: number, y: string, z: boolean) => void>
// [number, string, boolean]
type argsOpt = ArgumentsType<(x: number, y?: string, z?: boolean) => void>
// [number, (string | undefined)?, (boolean | undefined)?]
ถ้าคุณติดตั้ง npm install typescript@next คุณก็สามารถลองใช้งานสิ่งนี้ได้แล้ว มันน่าจะพร้อมใช้งานในสักวันหนึ่งของเดือนนี้
หมายเหตุ
เราสามารถแยก tuple ออกเป็น arguments ด้วยฟีเจอร์ใหม่นี้ได้เช่นกัน:
type Spread<T extends any[]> = (...args: T) => void;
type Func = Spread<args>
// (x: number, y: string, z: boolean) => void
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับฟีเจอร์นี้ได้ที่นี่
คำตอบ #2
ตั้งแต่ TypeScript 3.1 เป็นต้นไป ประเภท Parameters เป็นส่วนหนึ่งของไลบรารีมาตรฐานแล้ว
type Result = Parameters<(a: number, b: string) => boolean>; // [number, string]
