我有一个函数类型定义的别名:
IFn_1 = (_: any) => any
我想做的就是将其概括为以下内容:
IFn<n, out>
如何定义模板,其中n
是参数的数量,而out
是输出类型。这样,原始定义将变为:
IFn<1, any>
答案 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
之外,其他所有看起来都不错。
好的,希望能有所帮助;祝你好运!