当参数为某个值时定义返回类型

时间:2018-08-15 14:44:27

标签: javascript typescript typescript-typings

我有两个完全相同的定义,但是如果第一个在Promise<Cursor<T>>的值大于limit的情况下返回1,而第二个应该返回Promise<T>,如果limit is 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 个答案:

答案 0 :(得分:2)

您可以在重载中使用数字文字类型以获得所需的效果:

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<{}>