首页 > 解决方案 > 根据具有默认值的参数返回 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'.

任何帮助将不胜感激,谢谢!

标签: typescriptboolean

解决方案


如果你不传递任何东西 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

好的,希望有帮助;祝你好运!

Playground 代码链接


推荐阅读