diff --git a/index.d.ts b/index.d.ts index 4e5016a2cb..03c29ffd5d 100644 --- a/index.d.ts +++ b/index.d.ts @@ -357,6 +357,11 @@ export function bindActionCreators< /* compose */ +type Func0 = () => R; +type Func1 = (a1: T1) => R; +type Func2 = (a1: T1, a2: T2) => R; +type Func3 = (a1: T1, a2: T2, a3: T3, ...args: any[]) => R; + /** * Composes single-argument functions from right to left. The rightmost * function can take multiple arguments as it provides the signature for the @@ -367,27 +372,54 @@ export function bindActionCreators< * to left. For example, `compose(f, g, h)` is identical to doing * `(...args) => f(g(h(...args)))`. */ -export function compose(): (a: R, ...args: any[]) => R; +export function compose(): (a: R) => R; -export function compose( - f1: (b: A) => R, - f2: (...args: any[]) => A -): (...args: any[]) => R; +export function compose(f: F): F; +/* two functions */ +export function compose( + f1: (b: A) => R, f2: Func0 +): Func0; +export function compose( + f1: (b: A) => R, f2: Func1 +): Func1; +export function compose( + f1: (b: A) => R, f2: Func2 +): Func2; +export function compose( + f1: (b: A) => R, f2: Func3 +): Func3; + +/* three functions */ export function compose( - f1: (b: B) => R, - f2: (a: A) => B, - f3: (...args: any[]) => A -): (...args: any[]) => R; - + f1: (b: B) => R, f2: (a: A) => B, f3: Func0 +): Func0; +export function compose( + f1: (b: B) => R, f2: (a: A) => B, f3: Func1 +): Func1; +export function compose( + f1: (b: B) => R, f2: (a: A) => B, f3: Func2 +): Func2; +export function compose( + f1: (b: B) => R, f2: (a: A) => B, f3: Func3 +): Func3; + +/* four functions */ export function compose( - f1: (b: C) => R, - f2: (a: B) => C, - f3: (a: A) => B, - f4: (...args: any[]) => A -): (...args: any[]) => R; - -export function compose( - f1: (a: any) => R, + f1: (b: C) => R, f2: (a: B) => C, f3: (a: A) => B, f4: Func0 +): Func0; +export function compose( + f1: (b: C) => R, f2: (a: B) => C, f3: (a: A) => B, f4: Func1 +): Func1; +export function compose( + f1: (b: C) => R, f2: (a: B) => C, f3: (a: A) => B, f4: Func2 +): Func2; +export function compose( + f1: (b: C) => R, f2: (a: B) => C, f3: (a: A) => B, f4: Func3 +): Func3; + +/* rest */ +export function compose( + f1: (b: C) => R, f2: (a: B) => C, f3: (a: A) => B, ...funcs: Function[] ): (...args: any[]) => R; diff --git a/test/typescript/compose.ts b/test/typescript/compose.ts index 5ee9328eb9..1464add0b6 100644 --- a/test/typescript/compose.ts +++ b/test/typescript/compose.ts @@ -16,7 +16,20 @@ const t4: (a: string) => number = compose( const t5: number = compose(stringToNumber, numberToString, numberToNumber)(5); -const t6: string = compose(numberToString, stringToNumber, numberToString, numberToNumber)(5); +const t6: string = compose(numberToString, stringToNumber, numberToString, + numberToNumber)(5); -const t7: string = compose( - numberToString, numberToNumber, stringToNumber, numberToString, stringToNumber)("fo"); +const t7: string = compose( + numberToString, numberToNumber, stringToNumber, numberToString, + stringToNumber)("fo"); + + +const multiArgFn = (a: string, b: number, c: boolean): string => 'foo' + +const t8: string = compose(multiArgFn)('bar', 42, true); +const t9: number = compose(stringToNumber, multiArgFn)('bar', 42, true); +const t10: string = compose(numberToString, stringToNumber, + multiArgFn)('bar', 42, true); + +const t11: number = compose(stringToNumber, numberToString, stringToNumber, + multiArgFn)('bar', 42, true);