type TupleOfLengthHelper = V['length'] extends T ? V : TupleOfLengthHelper; /** * Utility type that represents a tuple of a specific length */ export type TupleOfLength = TupleOfLengthHelper; /** * Given the number of required and optional elements, evaluates to true if the specified tuple * indeed has the specified number of elements, false otherwise. */ type CheckTupleHelper = T extends [] ? OptionalElements['length'] extends OptArgs ? true : false : Partial extends T ? CheckTupleHelper<[], OptArgs, Required> : T extends [any, ...infer Rest] ? CheckTupleHelper : never; /** * Given the number of required and optional * parameters, determine if the provided function * type has the correct signature */ export type HasCorrectParameters any, OptArgs extends number | true> = OptArgs extends number ? number extends Parameters['length'] ? never : CheckTupleHelper, OptArgs, []> extends true ? T : never : number extends Parameters['length'] ? T : never; /** * Helper type to recursively make properties that are also objects * partial * * By default, `Partial>` is equivalent to `Array`. For this type, `Array` will be * transformed to Array> instead */ export type RecursivePartial = T extends Array ? Array> : T extends (...args: any[]) => any ? T : T extends Record ? Partial<{ [K in keyof T]: RecursivePartial; }> : T; export {};