首页 > 解决方案 > 当参数为某个值时定义返回类型

问题描述

我有两个完全相同的定义,但是我希望第一个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
}

标签: javascripttypescripttypescript-typings

解决方案


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

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

推荐阅读