diff --git a/flat/flat-tests.ts b/flat/flat-tests.ts
new file mode 100644
index 000000000..b6909cdb1
--- /dev/null
+++ b/flat/flat-tests.ts
@@ -0,0 +1,57 @@
+///
+
+import {flatten, unflatten} from "flat";
+
+module TestFlatten {
+ let options: {
+ delimiter?: string;
+ safe?: boolean;
+ maxDepth?: number;
+ };
+
+ type Target = {
+ a: {
+ b: number;
+ },
+ c: boolean[][];
+ };
+
+ let target: Target;
+
+ type Result = {
+ 'a.b': number;
+ 'c.0.0': boolean;
+ };
+
+ let result: Result;
+
+ result = flatten(target);
+ result = flatten(target, options);
+}
+
+module TestUnflatten {
+ let options: {
+ delimiter?: string;
+ object?: boolean;
+ overwrite?: boolean;
+ };
+
+ type Target = {
+ 'a.b': number;
+ 'c.0.0': boolean;
+ };
+
+ let target: Target;
+
+ type Result = {
+ a: {
+ b: number;
+ },
+ c: boolean[][];
+ };
+
+ let result: Result;
+
+ result = unflatten(target);
+ result = unflatten(target, options);
+}
diff --git a/flat/flat.d.ts b/flat/flat.d.ts
new file mode 100644
index 000000000..f3698f125
--- /dev/null
+++ b/flat/flat.d.ts
@@ -0,0 +1,41 @@
+// Type definitions for flat
+// Project: https://github.com/hughsk/flat
+// Definitions by: Ilya Mochalov
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+declare module FlatTypes {
+ interface FlattenOptions {
+ delimiter?: string;
+ safe?: boolean;
+ maxDepth?: number;
+ }
+
+ interface Flatten {
+ (
+ target: TTarget,
+ options?: FlattenOptions
+ ): TResult;
+
+ flatten: Flatten;
+ unflatten: Unflatten;
+ }
+
+ interface UnflattenOptions {
+ delimiter?: string;
+ object?: boolean;
+ overwrite?: boolean;
+ }
+
+ interface Unflatten {
+ (
+ target: TTarget,
+ options?: UnflattenOptions
+ ): TResult;
+ }
+}
+
+declare module "flat" {
+ var flatten: FlatTypes.Flatten;
+
+ export = flatten;
+}