有没有一种方法可以概括函数类型中的参数数量?

时间:2019-07-14 01:07:06

标签: typescript

我有一个函数类型定义的别名:

IFn_1 = (_: any) => any

我想做的就是将其概括为以下内容:

IFn<n, out>

如何定义模板,其中n是参数的数量,而out是输出类型。这样,原始定义将变为:

IFn<1, any>

1 个答案:

答案 0 :(得分:2)

如果有一种简单的方法来生成tuple,并且将其期望的长度设为numeric literal type,那么这将是一个容易回答的问题。不幸的是,尽管已经suggested,但它还不是该语言的一部分。

实际上,我们能做的最好的事情(不支持recursive conditional types)是使我们自己的类型别名TupleOfLength<N, V>产生一个元组N副本,其值类型为{{1} }最多V的硬编码最大数字。这是一种方法:

N

type TupleOfLength<N extends number, V = any> = Extract< [ [], [V], [V, V], [V, V, V], [V, V, V, V], [V, V, V, V, V], [V, V, V, V, V, V], [V, V, V, V, V, V, V], [V, V, V, V, V, V, V, V], // add more here if you need them ...V[][] ][N], any[] >; 在预期范围内时,此方法效果很好:

N

在不是这样的情况下效果不佳:

type SixStrings = TupleOfLength<6, string>;
// type SixStrings = [string, string, string, string, string, string] ?

因此,我们以type AMillionBooleans = TupleOfLength<1000000, boolean>; // type AMillionBooleans = boolean[] oh well ? 作为给定并使用它来定义TupleOfLength<N, V>

IFn<N, R>

让我们看看它是否有效:

type IFn<N extends number, R = void> = (...args: TupleOfLength<N, any>) => R;

除了我们将太大的数字传递到type ThreeInStringOut = IFn<3, string>; // type ThreeInStringOut = (args_0: any, args_1: any, args_2: any) => string type NoneInNumberOut = IFn<0, number>; // type NoneInNumberOut = () => number type OneInAnyOut = IFn<1, any>; // type OneInAnyOut = (args_0: any) => any type GoogolInGoogolOut = IFn<1e100, 1e100>; // type GoogolInGoogolOut = (...args: any[]) => 1e+100 o 之外,其他所有看起来都不错。

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

Link to code