From 8c48a39b1090c7af830e3a0b59b1408198e18471 Mon Sep 17 00:00:00 2001 From: Daniel Lytkin Date: Mon, 12 Dec 2016 22:53:14 +0700 Subject: [PATCH] Typings tweaks * Allow selectors accept extra arguments * Remove `...rest` versions of `createSelector` * Update `createStructuredSelector` to use Mapped types --- package.json | 2 +- src/index.d.ts | 331 ++++++++++++++++++++++++++++++++-------- typescript_test/test.ts | 23 +-- 3 files changed, 274 insertions(+), 82 deletions(-) diff --git a/package.json b/package.json index a2de5e76c..9fc151412 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "mocha": "^2.2.5", "ncp": "^2.0.0", "nyc": "^6.4.0", - "typescript": "^2.1.1", + "typescript": "^2.1.4", "typings-tester": "^0.2.0" } } diff --git a/src/index.d.ts b/src/index.d.ts index 25dfd381a..a416e62a9 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -1,6 +1,7 @@ export type Selector = (state: S) => R; -export type ParametricSelector = (state: S, props: P) => R; +export type ParametricSelector = (state: S, props: P, + ...args: any[]) => R; /* one selector */ @@ -143,30 +144,131 @@ export function createSelector( res7: R7, res8: R8) => T, ): ParametricSelector; -/* rest */ -export function createSelector( - selector1: Selector, - selector2: Selector, - selector3: Selector, - selector4: Selector, - selector5: Selector, - selector6: Selector, - selector7: Selector, - selector8: Selector, - ...rest: Function[], +/* nine selectors */ +export function createSelector( + selector1: Selector, + selector2: Selector, + selector3: Selector, + selector4: Selector, + selector5: Selector, + selector6: Selector, + selector7: Selector, + selector8: Selector, + selector9: Selector, + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9) => T, +): Selector; +export function createSelector( + selector1: ParametricSelector, + selector2: ParametricSelector, + selector3: ParametricSelector, + selector4: ParametricSelector, + selector5: ParametricSelector, + selector6: ParametricSelector, + selector7: ParametricSelector, + selector8: ParametricSelector, + selector9: ParametricSelector, + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9) => T, +): ParametricSelector; + +/* ten selectors */ +export function createSelector( + selector1: Selector, + selector2: Selector, + selector3: Selector, + selector4: Selector, + selector5: Selector, + selector6: Selector, + selector7: Selector, + selector8: Selector, + selector9: Selector, + selector10: Selector, + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9, res10: R10) => T, ): Selector; -export function createSelector( - selector1: ParametricSelector, - selector2: ParametricSelector, - selector3: ParametricSelector, - selector4: ParametricSelector, - selector5: ParametricSelector, - selector6: ParametricSelector, - selector7: ParametricSelector, - selector8: ParametricSelector, - ...rest: Function[], +export function createSelector( + selector1: ParametricSelector, + selector2: ParametricSelector, + selector3: ParametricSelector, + selector4: ParametricSelector, + selector5: ParametricSelector, + selector6: ParametricSelector, + selector7: ParametricSelector, + selector8: ParametricSelector, + selector9: ParametricSelector, + selector10: ParametricSelector, + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9, res10: R10) => T, +): ParametricSelector; + +/* eleven selectors */ +export function createSelector( + selector1: Selector, + selector2: Selector, + selector3: Selector, + selector4: Selector, + selector5: Selector, + selector6: Selector, + selector7: Selector, + selector8: Selector, + selector9: Selector, + selector10: Selector, + selector11: Selector, + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9, res10: R10, res11: R11) => T, +): Selector; +export function createSelector( + selector1: ParametricSelector, + selector2: ParametricSelector, + selector3: ParametricSelector, + selector4: ParametricSelector, + selector5: ParametricSelector, + selector6: ParametricSelector, + selector7: ParametricSelector, + selector8: ParametricSelector, + selector9: ParametricSelector, + selector10: ParametricSelector, + selector11: ParametricSelector, + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9, res10: R10, res11: R11) => T, ): ParametricSelector; +/* twelve selectors */ +export function createSelector( + selector1: Selector, + selector2: Selector, + selector3: Selector, + selector4: Selector, + selector5: Selector, + selector6: Selector, + selector7: Selector, + selector8: Selector, + selector9: Selector, + selector10: Selector, + selector11: Selector, + selector12: Selector, + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9, res10: R10, res11: R11, res12: R12) => T, +): Selector; +export function createSelector( + selector1: ParametricSelector, + selector2: ParametricSelector, + selector3: ParametricSelector, + selector4: ParametricSelector, + selector5: ParametricSelector, + selector6: ParametricSelector, + selector7: ParametricSelector, + selector8: ParametricSelector, + selector9: ParametricSelector, + selector10: ParametricSelector, + selector11: ParametricSelector, + selector12: ParametricSelector, + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9, res10: R10, res11: R11, res12: R12) => T, +): ParametricSelector; + + /* array argument */ /* one selector */ @@ -283,34 +385,154 @@ export function createSelector( res7: R7) => T, ): ParametricSelector; -/* eight and more selectors */ -export function createSelector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector -] & {[index: number]: Selector}, T>( - selectors: SS, +/* eight selectors */ +export function createSelector( + selectors: [Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector], combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, - res7: R7, res8: R8, ...rest: any[]) => T, + res7: R7, res8: R8) => T, ): Selector; -export function createSelector, - ParametricSelector, - ParametricSelector, - ParametricSelector, - ParametricSelector, - ParametricSelector, - ParametricSelector, - ParametricSelector -] & {[index: number]: ParametricSelector}, T>( - selectors: SS, +export function createSelector( + selectors: [ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector], combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, - res7: R7, res8: R8, ...rest: any[]) => T, + res7: R7, res8: R8) => T, +): ParametricSelector; + +/* nine selectors */ +export function createSelector( + selectors: [Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector], + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9) => T, +): Selector; +export function createSelector( + selectors: [ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector], + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9) => T, +): ParametricSelector; + +/* ten selectors */ +export function createSelector( + selectors: [Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector], + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9, res10: R10) => T, +): Selector; +export function createSelector( + selectors: [ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector], + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9, res10: R10) => T, +): ParametricSelector; + +/* eleven selectors */ +export function createSelector( + selectors: [Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector], + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9, res10: R10, res11: R11) => T, +): Selector; +export function createSelector( + selectors: [ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector], + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9, res10: R10, res11: R11) => T, +): ParametricSelector; + +/* twelve selectors */ +export function createSelector( + selectors: [Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector, + Selector], + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9, res10: R10, res11: R11, res12: R12) => T, +): Selector; +export function createSelector( + selectors: [ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector, + ParametricSelector], + combiner: (res1: R1, res2: R2, res3: R3, res4: R4, res5: R5, res6: R6, + res7: R7, res8: R8, res9: R9, res10: R10, res11: R11, res12: R12) => T, ): ParametricSelector; @@ -349,22 +571,11 @@ export function createSelectorCreator( ...rest: any[], ): typeof createSelector; - export function createStructuredSelector( - selectors: {[key: string]: Selector}, + selectors: {[K in keyof T]: Selector}, selectorCreator?: typeof createSelector, ): Selector; export function createStructuredSelector( - selectors: {[key: string]: ParametricSelector}, + selectors: {[K in keyof T]: ParametricSelector}, selectorCreator?: typeof createSelector, ): ParametricSelector; - -// todo: for TypeScript 2.1: -// export function createStructuredSelector( -// selectors: {[K in keyof T]: Selector}, -// selectorCreator?: typeof createSelector, -// ): Selector; -// export function createStructuredSelector( -// selectors: {[K in keyof T]: ParametricSelector}, -// selectorCreator?: typeof createSelector, -// ): ParametricSelector; diff --git a/typescript_test/test.ts b/typescript_test/test.ts index 4fcfbe31e..eae9850ff 100644 --- a/typescript_test/test.ts +++ b/typescript_test/test.ts @@ -86,25 +86,6 @@ function testInvalidTypeInCombinator() { ); } -function testRestParameters() { - type MyState = {foo: string, bar: number}; - createSelector( - (state: MyState) => state.foo, - (state: MyState) => state.foo, - (state: MyState) => state.foo, - (state: MyState) => state.foo, - (state: MyState) => state.foo, - (state: MyState) => state.bar, - (state: MyState) => state.bar, - (state: MyState) => state.bar, - (state: MyState) => state.bar, - (state: MyState) => state.bar, - (foo1: string, foo2: string, foo3: string, foo4: string, foo5: string, - bar1: number, bar2: number, bar3: number, bar4: number, bar5: string) => { - } - ); -} - function testParametricSelector() { type State = {foo: string;}; type Props = {bar: number}; @@ -364,12 +345,12 @@ function testCreateStructuredSelector() { bar: (state: {baz: boolean}) => 1 }); - // todo: this should fail in TypeScript 2.1 + // typings:expect-error createStructuredSelector<{foo: string}, {bar: number}>({ bar: state => state.foo }); - // todo: this should fail in TypeScript 2.1 + // typings:expect-error createStructuredSelector<{foo: string}, {bar: number}>({ baz: state => state.foo });