繁体   English   中英

如果在打字稿中传递可选参数,则更改函数返回类型

[英]Change function return type if optional argument is passed in typescript

我有以下功能:

const lists = {mylist: ["alpha", "beta", "gamme"]};

function foo(listName, element) { 
    if (typeof element !== 'undefined') {
        return !!lists[listName].find(x => x === element);
    }

    return [lists[listName], () => refreshLists()];
}

foo('mylist'); // returns [string[], () => any]
foo('mylist', 'alpha') // returns boolean

如您所见,该函数有 2 种不同的返回类型,具体取决于是否设置了参数element 我如何用打字稿正确表示,以便编辑器根据传递的参数数量选择正确的返回类型?

我当前的解决方案看起来像这样,但编辑器无法识别:

export type FnReturnType<T> = [T] extends [undefined] ? [string[], () => any] : boolean;

function foo<T extends string | undefined>(listName: string, element: T): FnReturnType<T> { 
    if (typeof element !== 'undefined') {
        return !!lists[listName].find(x => x === element);
    }

    return [lists[listName], () => refreshLists()];
}

如果typeof element !== undefined而不是[string[], () => any]我如何制作一个返回布尔值的条件类型?

使用函数重载

您为不同的参数类型和返回类型编写两个单独的重载签名,然后编写将返回正确值的函数实现。

function foo(listName: string): [string[], () => any]; // overload signature #1
function foo(listName: string, element: string): boolean; // overload signature #2
function foo(listName: string, element?: string): boolean | [string[], () => any] { // function implementation
  if (typeof element !== 'undefined') {
      return !!lists[listName].find(x => x === element);
  } 
  
  return [lists[listName], () => refreshLists()];
}

检查操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM