diff --git a/knockout.projections/knockout.projections-tests.ts b/knockout.projections/knockout.projections-tests.ts
index 3d479e7ac3..d8d6c8dcdd 100644
--- a/knockout.projections/knockout.projections-tests.ts
+++ b/knockout.projections/knockout.projections-tests.ts
@@ -26,3 +26,31 @@ sourceItems.push(9);
sourceItems.push(10);
// evenSquares now contains [36, 16, 4, 100]
+
+// Testing mapping options
+
+interface IComplexItem {
+ value: string;
+ dispose(): void;
+}
+
+var complexItems = sourceItems.map({
+ mapping: x => {
+ var item: IComplexItem = {
+ value: (x * x).toString(),
+ dispose: () => { }
+ };
+
+ return item;
+ },
+ disposeItem: (item: IComplexItem) => item.dispose()
+});
+
+var complexItems2 = sourceItems.map({
+ mappingWithDisposeCallback: x => {
+ return {
+ mappedValue: (x * x).toString(),
+ dispose: () => { }
+ };
+ }
+});
diff --git a/knockout.projections/knockout.projections.d.ts b/knockout.projections/knockout.projections.d.ts
index 77f3bf0ec8..a9ff8b5f3c 100644
--- a/knockout.projections/knockout.projections.d.ts
+++ b/knockout.projections/knockout.projections.d.ts
@@ -6,7 +6,17 @@
///
interface KnockoutObservableArrayFunctions {
-
- map(mapping: (value: T) => TResult): KnockoutObservableArray;
+ map(mappingOptions: {
+ mappingWithDisposeCallback: (value: T) => {
+ mappedValue: TResult;
+ dispose: () => void;
+ };
+ }): KnockoutObservableArray;
+ map(mappingOptions: {
+ mapping: (value: T) => TResult;
+ disposeItem?: (mappedItem: TResult) => void;
+ }): KnockoutObservableArray;
+ map(mappingOptions: (value: T) => TResult): KnockoutObservableArray;
+
filter(predicate: (value: T) => boolean): KnockoutObservableArray;
}