Merge pull request #23478 from ffMathy/patch-2

fix for knockout mapping bug reported in #23015
This commit is contained in:
Daniel Rosenwasser
2018-02-28 15:05:15 -08:00
committed by GitHub
3 changed files with 31 additions and 11 deletions

View File

@@ -13,6 +13,10 @@ declare var self: KnockoutMapping;
export = self;
declare global {
type KnockoutObservableType<T> = {
[P in keyof T]: KnockoutObservable<KnockoutObservableType<T[P]>>|T[P];
};
interface KnockoutMappingCreateOptions {
data: any;
parent: any;
@@ -48,7 +52,8 @@ declare global {
fromJSON(jsonString: string, targetOrOptions: any): any;
fromJSON(jsonString: string, inputOptions: any, target: any): any;
toJS<T>(viewModel: KnockoutObservableArray<T>|KnockoutObservableType<T>[]|KnockoutObservableArray<KnockoutObservableType<T>>|T[], options?: KnockoutMappingOptions): T[];
toJS<T>(viewModel: KnockoutObservable<T>|KnockoutObservableType<T>|KnockoutObservable<KnockoutObservableType<T>>|T, options?: KnockoutMappingOptions): T;
toJS<T>(viewModel: KnockoutObservable<T>|KnockoutObservableType<T>|KnockoutObservable<KnockoutObservableType<T>>, options?: KnockoutMappingOptions): T;
toJS<T>(viewModel: T, options?: KnockoutMappingOptions): T;
toJSON(rootObject: any, options?: KnockoutMappingOptions): string;
defaultOptions(): KnockoutMappingOptions;
resetDefaultOptions(): void;

View File

@@ -410,10 +410,6 @@ interface KnockoutTasks {
}
/////////////////////////////////
type KnockoutObservableType<T> = {
[P in keyof T]: KnockoutObservable<T[P]>;
};
interface KnockoutStatic {
utils: KnockoutUtils;
memoization: KnockoutMemoization;
@@ -444,12 +440,18 @@ interface KnockoutStatic {
contextFor(node: any): any;
isSubscribable(instance: any): instance is KnockoutSubscribable<any>;
toJSON(viewModel: any, replacer?: Function, space?: any): string;
toJS<T>(viewModel: KnockoutObservableArray<T>|KnockoutObservableType<T>[]|KnockoutObservableArray<KnockoutObservableType<T>>|T[]): T[];
toJS<T>(viewModel: KnockoutObservable<T>|KnockoutObservableType<T>|KnockoutObservable<KnockoutObservableType<T>>): T;
toJS<T>(viewModel: T): T;
isObservable<T>(instance: KnockoutObservable<T>|T): instance is KnockoutObservable<T>;
isWriteableObservable<T>(instance: KnockoutObservable<T>|T): instance is KnockoutObservable<T>;
isComputed<T>(instance: KnockoutObservable<T>|T): instance is KnockoutComputed<T>;
toJS(viewModel: any): any;
isObservable(instance: any): instance is KnockoutObservable<any>;
isObservable<T>(instance: KnockoutObservable<T>): instance is KnockoutObservable<T>;
isWriteableObservable(instance: any): instance is KnockoutObservable<any>;
isWriteableObservable<T>(instance: KnockoutObservable<T>): instance is KnockoutObservable<T>;
isComputed(instance: any): instance is KnockoutComputed<any>;
isComputed<T>(instance: KnockoutObservable<T> | T): instance is KnockoutComputed<T>;
dataFor(node: any): any;
removeNode(node: Node): void;
cleanNode(node: Node): Node;

View File

@@ -96,6 +96,19 @@ class GetterViewModel {
public range: KnockoutObservable<any>;
}
function testToJs() {
var objKo = {
prop: ko.observable("prop"),
subKo: ko.observable({
prop: ko.observable("prop")
})
};
var objJs = ko.toJS(objKo);
objJs.prop; // $ExpectType any
objJs.subKo.prop; // $ExpectType any
}
function testGetter() {
var model = new GetterViewModel();