flowtype:如何通过参数计数/类型重载函数返回类型?

nrs*_*ser 6 javascript overloading flowtype

我想定义一个重载函数,如

function first(n?: number) {
  if (number === undefined) {
    // returns a single Item
    return items[0];
  }

  // returns an array of Item
  return items.slice(0, n);
}
Run Code Online (Sandbox Code Playgroud)

以便这些语句类型检查:

const item: Item = first(); // no args, so return type is Item
const items: Array<Item> = first(5); // number arg, so return type is Array<Item>
Run Code Online (Sandbox Code Playgroud)

flow 知道第一次调用first将导致n === undefined(因为如果undefined对 无效,它会抱怨n)并且它理解它将采用 if 分支,所以我认为它可以推断返回类型是Item,但一切我试过要么让任何事情通过,要么总是失败。

知道这是否可能吗?提前感谢互联网。

Nat*_*ote 5

我没有给你一个完整的解决方案,但我已经做到了:

const items = [1, 2, 3];

type FirstType = ((_: void) => number) & ((n: number) => Array<number>);

const first: FirstType = (n?: number) => {
  if (n === undefined) {
    // returns a single Item
    return (items[0]: any);
  } else {
    // returns an array of Item
    return (items.slice(0, n): any);
  }
}

const a: number = first();
const b: Array<number> = first(2);
Run Code Online (Sandbox Code Playgroud)

尝试流程

&是交叉点型,并且这意味着first必须满足这两种这些类型的。您可以看到以first()您想要的方式进行类型检查的调用。

不幸的是,Flow 目前似乎无法对first. 请注意,我必须any强制转换返回值以转义类型检查器。如果您愿意在函数体中放弃类型检查,您至少可以在调用函数的地方得到它。