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

javascript - กำหนดชนิดข้อมูลที่คืนค่าตอนที่พารามิเตอร์มีค่าเป็นค่าหนึ่ง


ฉันมีคำจำกัดความสองแบบที่เหมือนกันทุกประการ อย่างไรก็ตามฉันต้องการให้แบบแรกคืนค่า Promise<Cursor<T>> เมื่อค่าของ limit มากกว่า 1 และแบบที่สองควรคืนค่า Promise<T> หากค่าของ limit เท่ากับ 1 ฉันควรกำหนดแบบนี้อย่างไร มันสามารถกำหนดได้หรือมีวิธีการอื่นในการกำหนดหรือไม่?

public async select<T extends any>(limit: number): Promise<Cursor<T>>

public async select<T extends any>(limit: number): limit is 1 && Promise<T>

public async select<T extends any>(...args: any[]): Promise<T | Cursor<T>> {
  // Do query and return the Pomise
}

คำตอบ #1

คุณสามารถใช้ชนิดตัวเลขตัวเลขในโอเวอร์โหลดของคุณเพื่อให้ได้ผลลัพธ์ที่ต้องการ:

class Cursor<T>{}
class O {

    public async select<T extends any>(limit: 1): Promise<T>
    public async select<T extends any>(limit: number): Promise<Cursor<T>>


    public async select<T extends any>(...args: any[]): Promise<T | Cursor<T>> {
        return null as any

    }
}
let o = new O();
let s = o.select(1) // Promise<{}>
let m = o.select(2) // Promise<Cursor<{}>>

อย่างไรก็ตาม สิ่งนี้จะใช้ได้ก็ต่อเมื่อคุณส่งค่าคงที่ 1 ไปยังฟังก์ชัน และอาจทำให้เกิดความสับสนมากกว่าที่คุ้มค่า

let n = 1;
o.select(n);//  n is a number so it's types as a Promise<Cursor<{}>> 
const constOne = 1;
o.select(constOne);// Promise<{}>