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);
}

这样这些语句的类型检查:

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>

流动知道在第一次调用first会导致n === undefined(因为如果它会抱怨undefined无效的n),并且它知道它会再取如果分支,所以,我觉得它可以推断返回类型Item,但一切我尝试要么让任何事情通过要么总是失败。

知道这是否可能吗?在此先感谢互联网。

纳特·莫特

我没有为您提供完整的解决方案,但是我已经做到了:

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);

tryflow

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

不幸的是,似乎Flow目前无法对的主体进行类型检查first请注意,我必须any强制转换返回值以逃避类型检查器。如果您不想在函数的主体中进行类型检查,则至少可以在调用函数的地方获得它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

函数是否按返回类型重载?

通过参数计数推导重载成员函数的函数参数类型

在C#中按返回类型重载函数

TypeScript:基于参数的函数返回类型,无需重载

当重载operator <<时出错,“不能单独按返回类型区分重载函数”

如何获取Scala函数的参数/返回类型?

模板类型推导如何使用重载函数作为参数

如何使用多个可选参数对函数进行类型重载?

Postgres:如何创建返回setof类型的重载函数

按返回类型重载功能模板

在Powershell构造函数中按类型重载?

如何根据参数类型转换函数的返回类型?

Typescript:如何根据参数类型获取函数的返回类型?

不同类型的重载函数和参数

重载,可变参数函数和布尔类型

根据参数中向量的类型重载函数

如何按值返回“自动”返回类型函数

TypeScript 构造函数重载返回不同的类型

别名const重载函数的返回类型

函数返回类型重载 C++

基于可选参数存在的Typescript函数返回类型,而不使用函数重载

给定类型为Container <T> :: Iterator的函数参数,如何为某些类型的T实现特定的重载?

从函数返回类型推断模板参数类型

TypeScript - 基于参数类型的函数返回类型

“不能单独按返回类型区分重载函数”是什么意思?

从函数参数返回类型提示

TypeScript 泛型工厂函数基于实例参数返回类型而不重载

即使重载函数的参数计数不匹配,编译器是否应该实例化所有参数相关类型

如何选择的参数类型重载方法?