import type { AnyFunction, CreateTuple, Tail } from 'type-plus' import type { Properties } from './_properties.js' /** * Converts a function's parameter types to `Args` type for Storybook. * Each name maps to the parameter type at the same index in F. * * @example * type F = (a: number, b: string) => void * type R = FnToArgTypes // { x: number; y: string } */ export type FnToArgTypes< F extends AnyFunction, Names extends CreateTuple['length'], string> = CreateTuple['length'], string> > = Properties, Names>> type ReduceToRecord, Names extends Array> = Names['length'] extends 0 ? unknown : Names['length'] extends 1 ? Names extends [infer K extends string] ? { [I in K]: Params[0] } : never : Names extends [infer K extends string, ...infer Rest] ? { [I in K]: Params[0] } & ReduceToRecord, Rest> : Record