javascript - 当参数为某个值时定义返回类型
问题描述
我有两个完全相同的定义,但是我希望第一个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
}
解决方案
您可以在重载中使用数字文字类型来获得所需的效果:
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<{}>
推荐阅读
- reactjs - 如何在反应中添加输入文本事件处理程序
- ios - 命令 CompileXIB 因非零退出代码错误而失败
- android - 将 Future 变量返回到 Text Widget Flutter
- python - Pandas DataFrame 用最新的前一个正值替换负值
- php - PHP将循环字符串转换为数组
- php - laravel中带有env变量的主动静态属性
- python - os.path.expanduser("~") 不在heroku上工作
- css - 放置一个带有背景图像的响应式 SVG
- ada - C++ 中#define 的 Ada 等价物是什么?
- postgresql - 在postgresql中使用连接的列作为函数表的参数