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

มี 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]

บทความที่เกี่ยวข้อง