import { Fn } from '../../types'; import { curry, CurryRemainingParameters, CurryPlaceholderArr, CurryPartialArr } from './curry'; import { FN_PLACEHOLDER, isFnPlaceholder } from '../const/FN_PLACEHOLDER'; import { filter } from '../array/filter'; // todo 类型🤔 type PartialFn = { , R extends ReturnType, A extends any[] = CurryPlaceholderArr>>>(fn: F, ...args: A): Fn, R> >>>(fn, ...args: A): Fn, R> placeholder: FN_PLACEHOLDER } export const partial: PartialFn = (fn, ...args) => { return curry(fn, filter(args, v => !isFnPlaceholder(v)).length + 1)(...args as any); }; partial.placeholder = new FN_PLACEHOLDER(); // function log(name: string, age: number) { // // eslint-disable-next-line // console.log(...arguments) // } // const p = partial(log, 'hua'); // const r = p(1);