typescript - 根据具有默认值的参数返回 Promise 或布尔值
问题描述
我有一些代码将根据参数返回布尔值或承诺。
function setGuid<B extends boolean>(guid: string, shouldValidate?: B): B extends true ? boolean : Promise<boolean>
function setGuid(guid: string, shouldValidate?: boolean): boolean | Promise<boolean> {
if (shouldValidate){
return true
}
return Promise.resolve(true);
}
此功能有效。如果我调用setGuid("*", false)
它理解返回类型将是Promise<boolean>
同样如果我调用setGuid("*", true)
TypeScript 理解返回类型将是 a boolean
。
问题是我无法弄清楚如何设置默认返回类型,即Promise<boolean>
如果未提供 shouldValidate (可选参数) - 我希望 TypeScript 理解setGuid("*")
它将返回Promise<boolean>
。目前,如果我没有明确提供false
它认为boolean | Promise<boolean>
正在返回的第二个参数。
我打电话时遇到的错误setGuid("*")
是Property 'then' does not exist on type 'boolean | Promise<boolean>'. Property 'then' does not exist on type 'false'.
任何帮助将不胜感激,谢谢!
解决方案
如果你不传递任何东西 as shouldValidate
,那么编译器就没有任何东西可以用来推断B
. 因此,它将倾向于默认为其约束,即boolean
. 如您所见,这B extends true ? boolean : Promise<boolean>
将成为 union ,因此行为不佳。boolean | Promise<boolean>
在这种情况下,您可以向重载调用签名添加一个通用参数默认值,如下所示:
function setGuid<B extends boolean = false>(
guid: string,
shouldValidate?: B
): B extends true ? boolean : Promise<boolean>;
如果编译器无法以其他方式推断,则编译器将使用此默认值B
:
setGuid("*").then(x => x ? 0 : 1); // no error now
好的,希望有帮助;祝你好运!
推荐阅读
- web-scraping - 使用 ImportHTML 和 Google 表格进行网络抓取
- javascript - 如何在 Vis.js / D3.js 中以圆形模式排列节点
- angular - 模块“AppModule”导入的意外指令“MatAutoCompleteTrigger”。请添加@NgModule 注释
- python - 在运行的 bash 脚本中重定向 pip 安装消息
- python - 在 Keras 中检查模型输入以获取验证数据时出错
- javascript - 合并(更新)数组中的相同对象
- java - Jersey MultiPartRequest 接收 null
- html - 垂直对齐不适用于纯文本?
- php - OpenLDAP PHP 添加生日属性
- git - 带有 Git 的 Azure Devops 仅建议对最新提交的拉取请求