我想定义一个重载的函数
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] 删除。
我来说两句