diff --git a/knockout.projections/knockout.projections-tests.ts b/knockout.projections/knockout.projections-tests.ts
index 3d479e7ac..138d36946 100644
--- a/knockout.projections/knockout.projections-tests.ts
+++ b/knockout.projections/knockout.projections-tests.ts
@@ -26,3 +26,39 @@ 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: () => { }
+ };
+ }
+});
+
+// Test disposal
+
+evenSquares.dispose();
+
+complexItems.dispose();
+
+complexItems2.dispose();
diff --git a/knockout.projections/knockout.projections.d.ts b/knockout.projections/knockout.projections.d.ts
index 77f3bf0ec..e1443478a 100644
--- a/knockout.projections/knockout.projections.d.ts
+++ b/knockout.projections/knockout.projections.d.ts
@@ -5,8 +5,21 @@
///
+interface KnockoutMappedObservableArray extends KnockoutObservableArray, KnockoutSubscription {
+}
+
interface KnockoutObservableArrayFunctions {
-
- map(mapping: (value: T) => TResult): KnockoutObservableArray;
- filter(predicate: (value: T) => boolean): KnockoutObservableArray;
+ map(mappingOptions: {
+ mappingWithDisposeCallback: (value: T) => {
+ mappedValue: TResult;
+ dispose: () => void;
+ };
+ }): KnockoutMappedObservableArray;
+ map(mappingOptions: {
+ mapping: (value: T) => TResult;
+ disposeItem?: (mappedItem: TResult) => void;
+ }): KnockoutMappedObservableArray;
+ map(mappingOptions: (value: T) => TResult): KnockoutMappedObservableArray;
+
+ filter(predicate: (value: T) => boolean): KnockoutMappedObservableArray;
}