diff --git a/lodash/lodash-tests.ts b/lodash/lodash-tests.ts index def5a628f7..8a47a41f12 100644 --- a/lodash/lodash-tests.ts +++ b/lodash/lodash-tests.ts @@ -2605,9 +2605,10 @@ var returnedOnce = _.throttle(function (a: any) { return a * 5; }, 5); returnedOnce(4); var greetPartial = function (greeting: string, name: string) { return greeting + ' ' + name; }; -var hi = _.partial(greetPartial, 'hi'); +var hi = _.partial(greetPartial, 'hi'); hi('moe'); + var defaultsDeep = _.partialRight(_.merge, _.defaults); var optionsPartialRight = { @@ -4369,3 +4370,118 @@ result = <_.TemplateSettings>_.templateSettings; result = _(42).times(testTimesFn).value(); result = _(42).times(testTimesFn, any).value(); } + +// _.partial & _.partialRight +{ + function func0(): number { + return 42; + } + function func1(arg1: number): number { + return arg1 * 2; + } + function func2(arg1: number, arg2: string): number { + return arg1 * arg2.length; + } + function func3(arg1: number, arg2: string, arg3: boolean): number { + return arg1 * arg2.length + (arg3 ? 1 : 0); + } + function func4(arg1: number, arg2: string, arg3: boolean, arg4: number): number { + return arg1 * arg2.length + (arg3 ? 1 : 0) - arg4; + } + let res____: () => number; + let res1___: (arg1: number ) => number; + let res_2__: ( arg2: string ) => number; + let res__3_: ( arg3: boolean ) => number; + let res___4: ( arg4: number) => number; + let res12__: (arg1: number, arg2: string ) => number; + let res1_3_: (arg1: number, arg3: boolean ) => number; + let res1__4: (arg1: number, arg4: number) => number; + let res_23_: ( arg2: string, arg3: boolean ) => number; + let res_2_4: ( arg2: string, arg4: number) => number; + let res__34: ( arg3: boolean, arg4: number) => number; + let res123_: (arg1: number, arg2: string, arg3: boolean ) => number; + let res12_4: (arg1: number, arg2: string, arg4: number) => number; + let res1_34: (arg1: number, arg3: boolean, arg4: number) => number; + let res_234: ( arg2: string, arg3: boolean, arg4: number) => number; + let res1234: (arg1: number, arg2: string, arg3: boolean, arg4: number) => number; + + // + // _.partial + // + // with arity 0 function + res____ = _.partial(func0); + // with arity 1 function + res____ = _.partial(func1, 42 ); + res1___ = _.partial(func1 ); + // with arity 2 function + res12__ = _.partial(func2 ); + res_2__ = _.partial(func2, 42 ); + res1___ = _.partial(func2, _, "foo"); + res____ = _.partial(func2, 42, "foo"); + // with arity 3 function + res123_ = _.partial(func3 ); + res_23_ = _.partial(func3, 42 ); + res1_3_ = _.partial(func3, _, "foo" ); + res__3_ = _.partial(func3, 42, "foo" ); + res12__ = _.partial(func3, _, _, true); + res_2__ = _.partial(func3, 42, _, true); + res1___ = _.partial(func3, _, "foo", true); + res____ = _.partial(func3, 42, "foo", true); + // with arity 4 function + res1234 = _.partial(func4 ); + res_234 = _.partial(func4, 42 ); + res1_34 = _.partial(func4, _, "foo" ); + res__34 = _.partial(func4, 42, "foo" ); + res12_4 = _.partial(func4, _, _, true ); + res_2_4 = _.partial(func4, 42, _, true ); + res1__4 = _.partial(func4, _, "foo", true ); + res___4 = _.partial(func4, 42, "foo", true ); + res123_ = _.partial(func4, _, _, _, 100); + res_23_ = _.partial(func4, 42, _, _, 100); + res1_3_ = _.partial(func4, _, "foo", _, 100); + res__3_ = _.partial(func4, 42, "foo", _, 100); + res12__ = _.partial(func4, _, _, true, 100); + res_2__ = _.partial(func4, 42, _, true, 100); + res1___ = _.partial(func4, _, "foo", true, 100); + res____ = _.partial(func4, 42, "foo", true, 100); + + // + // _.partialRight + // + // with arity 0 function + res____ = _.partialRight(func0); + // with arity 1 function + res____ = _.partialRight(func1, 42 ); + res1___ = _.partialRight(func1 ); + // with arity 2 function + res12__ = _.partialRight(func2 ); + res_2__ = _.partialRight(func2, 42, _); + res1___ = _.partialRight(func2, "foo"); + res____ = _.partialRight(func2, 42, "foo"); + // with arity 3 function + res123_ = _.partialRight(func3 ); + res_23_ = _.partialRight(func3, 42, _, _); + res1_3_ = _.partialRight(func3, "foo", _); + res__3_ = _.partialRight(func3, 42, "foo", _); + res12__ = _.partialRight(func3, true); + res_2__ = _.partialRight(func3, 42, _, true); + res1___ = _.partialRight(func3, "foo", true); + res____ = _.partialRight(func3, 42, "foo", true); + // with arity 4 function + res1234 = _.partialRight(func4 ); + res_234 = _.partialRight(func4, 42, _, _, _); + res1_34 = _.partialRight(func4, "foo", _, _); + res__34 = _.partialRight(func4, 42, "foo", _, _); + res12_4 = _.partialRight(func4, true, _); + res_2_4 = _.partialRight(func4, 42, _, true, _); + res1__4 = _.partialRight(func4, "foo", true, _); + res___4 = _.partialRight(func4, 42, "foo", true, _); + res123_ = _.partialRight(func4, 100); + res_23_ = _.partialRight(func4, 42, _, _, 100); + res1_3_ = _.partialRight(func4, "foo", _, 100); + res__3_ = _.partialRight(func4, 42, "foo", _, 100); + res12__ = _.partialRight(func4, true, 100); + res_2__ = _.partialRight(func4, 42, _, true, 100); + res1___ = _.partialRight(func4, "foo", true, 100); + res____ = _.partialRight(func4, 42, "foo", true, 100); +} diff --git a/lodash/lodash.d.ts b/lodash/lodash.d.ts index 875c61d487..528356ff24 100644 --- a/lodash/lodash.d.ts +++ b/lodash/lodash.d.ts @@ -6508,9 +6508,55 @@ declare module _ { * @param args Arguments to be partially applied. * @return The new partially applied function. **/ - partial( - func: Function, - ...args: any[]): Function; + partial: Partial; + } + + type PH = LoDashStatic; + type Function0 = () => R; + type Function1 = (t1: T1) => R; + type Function2 = (t1: T1, t2: T2) => R; + type Function3 = (t1: T1, t2: T2, t3: T3) => R; + type Function4 = (t1: T1, t2: T2, t3: T3, t4: T4) => R; + + interface Partial { + // arity 0 + (func: Function0): Function0; + // arity 1 + (func: Function1): Function1; + (func: Function1, arg1: T1): Function0; + // arity 2 + (func: Function2): Function2; + (func: Function2, arg1: T1): Function1< T2, R>; + (func: Function2, plc1: PH, arg2: T2): Function1; + (func: Function2, arg1: T1, arg2: T2): Function0< R>; + // arity 3 + (func: Function3): Function3; + (func: Function3, arg1: T1): Function2< T2, T3, R>; + (func: Function3, plc1: PH, arg2: T2): Function2; + (func: Function3, arg1: T1, arg2: T2): Function1< T3, R>; + (func: Function3, plc1: PH, plc2: PH, arg3: T3): Function2; + (func: Function3, arg1: T1, plc2: PH, arg3: T3): Function1< T2, R>; + (func: Function3, plc1: PH, arg2: T2, arg3: T3): Function1; + (func: Function3, arg1: T1, arg2: T2, arg3: T3): Function0< R>; + // arity 4 + (func: Function4): Function4; + (func: Function4, arg1: T1): Function3< T2, T3, T4, R>; + (func: Function4, plc1: PH, arg2: T2): Function3; + (func: Function4, arg1: T1, arg2: T2): Function2< T3, T4, R>; + (func: Function4, plc1: PH, plc2: PH, arg3: T3): Function3; + (func: Function4, arg1: T1, plc2: PH, arg3: T3): Function2< T2, T4, R>; + (func: Function4, plc1: PH, arg2: T2, arg3: T3): Function2; + (func: Function4, arg1: T1, arg2: T2, arg3: T3): Function1< T4, R>; + (func: Function4, plc1: PH, plc2: PH, plc3: PH, arg4: T4): Function3; + (func: Function4, arg1: T1, plc2: PH, plc3: PH, arg4: T4): Function2< T2, T3, R>; + (func: Function4, plc1: PH, arg2: T2, plc3: PH, arg4: T4): Function2; + (func: Function4, arg1: T1, arg2: T2, plc3: PH, arg4: T4): Function1< T3, R>; + (func: Function4, plc1: PH, plc2: PH, arg3: T3, arg4: T4): Function2; + (func: Function4, arg1: T1, plc2: PH, arg3: T3, arg4: T4): Function1< T2, R>; + (func: Function4, plc1: PH, arg2: T2, arg3: T3, arg4: T4): Function1; + (func: Function4, arg1: T1, arg2: T2, arg3: T3, arg4: T4): Function0< R>; + // catch-all + (func: Function, ...args: any[]): Function; } //_.partialRight @@ -6522,9 +6568,48 @@ declare module _ { * @param args Arguments to be partially applied. * @return The new partially applied function. **/ - partialRight( - func: Function, - ...args: any[]): Function; + partialRight: PartialRight + } + + interface PartialRight { + // arity 0 + (func: Function0): Function0; + // arity 1 + (func: Function1): Function1; + (func: Function1, arg1: T1): Function0; + // arity 2 + (func: Function2): Function2; + (func: Function2, arg1: T1, plc2: PH): Function1< T2, R>; + (func: Function2, arg2: T2): Function1; + (func: Function2, arg1: T1, arg2: T2): Function0< R>; + // arity 3 + (func: Function3): Function3; + (func: Function3, arg1: T1, plc2: PH, plc3: PH): Function2< T2, T3, R>; + (func: Function3, arg2: T2, plc3: PH): Function2; + (func: Function3, arg1: T1, arg2: T2, plc3: PH): Function1< T3, R>; + (func: Function3, arg3: T3): Function2; + (func: Function3, arg1: T1, plc2: PH, arg3: T3): Function1< T2, R>; + (func: Function3, arg2: T2, arg3: T3): Function1; + (func: Function3, arg1: T1, arg2: T2, arg3: T3): Function0< R>; + // arity 4 + (func: Function4): Function4; + (func: Function4, arg1: T1, plc2: PH, plc3: PH, plc4: PH): Function3< T2, T3, T4, R>; + (func: Function4, arg2: T2, plc3: PH, plc4: PH): Function3; + (func: Function4, arg1: T1, arg2: T2, plc3: PH, plc4: PH): Function2< T3, T4, R>; + (func: Function4, arg3: T3, plc4: PH): Function3; + (func: Function4, arg1: T1, plc2: PH, arg3: T3, plc4: PH): Function2< T2, T4, R>; + (func: Function4, arg2: T2, arg3: T3, plc4: PH): Function2; + (func: Function4, arg1: T1, arg2: T2, arg3: T3, plc4: PH): Function1< T4, R>; + (func: Function4, arg4: T4): Function3; + (func: Function4, arg1: T1, plc2: PH, plc3: PH, arg4: T4): Function2< T2, T3, R>; + (func: Function4, arg2: T2, plc3: PH, arg4: T4): Function2; + (func: Function4, arg1: T1, arg2: T2, plc3: PH, arg4: T4): Function1< T3, R>; + (func: Function4, arg3: T3, arg4: T4): Function2; + (func: Function4, arg1: T1, plc2: PH, arg3: T3, arg4: T4): Function1< T2, R>; + (func: Function4, arg2: T2, arg3: T3, arg4: T4): Function1; + (func: Function4, arg1: T1, arg2: T2, arg3: T3, arg4: T4): Function0< R>; + // catch-all + (func: Function, ...args: any[]): Function; } //_.rearg