diff --git a/reselect/reselect-tests.ts b/reselect/reselect-tests.ts
new file mode 100644
index 0000000000..dd8031bc25
--- /dev/null
+++ b/reselect/reselect-tests.ts
@@ -0,0 +1,42 @@
+///
+import {createSelector, defaultMemoize} from "reselect";
+
+type Item1 = {
+ prop1: number;
+}
+
+type Item2 = {
+ prop2: number;
+}
+
+type State = {
+ item1: Item1,
+ item2: Item2
+}
+
+function getItem1(state: State, props: any): Item1 {
+ return state.item1;
+}
+
+function getItem2(state: State, props: any): Item2 {
+ return state.item2;
+}
+
+const selector = createSelector(
+ getItem1,
+ getItem2,
+ (item1: Item1, item2: Item2) => {
+ return item1.prop1 + item2.prop2;
+ }
+);
+
+const state = {
+ item1: { prop1: 10 },
+ item2: { prop2: 20 }
+}
+
+const props = { multiplier: 10 };
+const total: number = selector(state, props);
+
+const getItem2Memoized = defaultMemoize(getItem2);
+const memItem: Item2 = getItem2Memoized(state, {});
\ No newline at end of file
diff --git a/reselect/reselect.d.ts b/reselect/reselect.d.ts
new file mode 100644
index 0000000000..72d03a83a9
--- /dev/null
+++ b/reselect/reselect.d.ts
@@ -0,0 +1,36 @@
+// Type definitions for reselect v2.0.2
+// Project: https://github.com/rackt/reselect
+// Definitions by: Frank Wallis
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+declare module Reselect {
+
+ type Selector = (state: TInput, props?: any) => TOutput;
+
+ function createSelector(selector1: Selector, combiner: (arg1: T1) => TOutput): Selector;
+ function createSelector(selector1: Selector, selector2: Selector, combiner: (arg1: T1, arg2: T2) => TOutput): Selector;
+ function createSelector(selector1: Selector, selector2: Selector, selector3: Selector, combiner: (arg1: T1, arg2: T2, arg3: T3) => TOutput): Selector;
+ function createSelector(selector1: Selector, selector2: Selector, selector3: Selector, selector4: Selector, combiner: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TOutput): Selector;
+ function createSelector(selector1: Selector, selector2: Selector, selector3: Selector, selector4: Selector, selector5: Selector, combiner: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => TOutput): Selector;
+ function createSelector(selector1: Selector, selector2: Selector, selector3: Selector, selector4: Selector, selector5: Selector, selector6: Selector, combiner: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => TOutput): Selector;
+ function createSelector(selector1: Selector, selector2: Selector, selector3: Selector, selector4: Selector, selector5: Selector, selector6: Selector, selector7: Selector, combiner: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => TOutput): Selector;
+ function createSelector(selector1: Selector, selector2: Selector, selector3: Selector, selector4: Selector, selector5: Selector, selector6: Selector, selector7: Selector, selector8: Selector, combiner: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => TOutput): Selector;
+ function createSelector(selector1: Selector, selector2: Selector, selector3: Selector, selector4: Selector, selector5: Selector, selector6: Selector, selector7: Selector, selector8: Selector, selector9: Selector, combiner: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => TOutput): Selector;
+ function createSelector(selector1: Selector, selector2: Selector, selector3: Selector, selector4: Selector, selector5: Selector, selector6: Selector, selector7: Selector, selector8: Selector, selector9: Selector, selector10: Selector, combiner: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10) => TOutput): Selector;
+ 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: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11) => TOutput): Selector;
+ 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: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11, arg12: T12) => TOutput): Selector;
+ 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, selector13: Selector, combiner: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11, arg12: T12, arg13: T13) => TOutput): Selector;
+ 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, selector13: Selector, selector14: Selector, combiner: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11, arg12: T12, arg13: T13, arg14: T14) => TOutput): Selector;
+
+ function createStructuredSelector(inputSelectors: any, selectorCreator?: any): any;
+
+ type EqualityChecker = (arg1: T, arg2: T) => boolean;
+ type Memoizer = (func: TFunc, equalityCheck?: EqualityChecker) => TFunc;
+
+ const defaultMemoize: Memoizer;
+ function createSelectorCreator(memoize: Memoizer, ...memoizeOptions: any[]): any;
+}
+
+declare module "reselect" {
+ export = Reselect
+}
\ No newline at end of file