Merge pull request #33521 from mike-north/object-proxy-generic

[@ember/object] - Make Ember.ObjectProxy generic
This commit is contained in:
Gabriela Britto 2019-03-07 09:59:45 -08:00 committed by GitHub
commit 350ea557e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 61 additions and 2 deletions

View File

@ -1,12 +1,32 @@
import EmberObject from "@ember/object";
import {
UnwrapComputedPropertyGetter,
UnwrapComputedPropertyGetters
} from "@ember/object/-private/types";
/**
* `Ember.ObjectProxy` forwards all properties not defined by the proxy itself
* to a proxied `content` object.
*/
export default class ObjectProxy extends EmberObject {
export default class ObjectProxy<T extends object = object> extends EmberObject {
/**
* The object whose properties will be forwarded.
*/
content: object;
content: T | undefined;
get<K extends keyof this>(key: K): UnwrapComputedPropertyGetter<this[K]>;
get<K extends keyof T>(key: K): UnwrapComputedPropertyGetter<T[K]> | undefined;
getProperties<K extends keyof this>(
list: K[]
): Pick<UnwrapComputedPropertyGetters<this>, K>;
getProperties<K extends keyof this>(
...list: K[]
): Pick<UnwrapComputedPropertyGetters<this>, K>;
getProperties<K extends keyof T>(
list: K[]
): Pick<Partial<UnwrapComputedPropertyGetters<T>>, K>;
getProperties<K extends keyof T>(
...list: K[]
): Pick<Partial<UnwrapComputedPropertyGetters<T>>, K>;
}

View File

@ -0,0 +1,38 @@
import ObjectProxy from "@ember/object/proxy";
interface Book {
title: string;
subtitle: string;
chapters: Array<{ title: string }>;
}
class DefaultProxy extends ObjectProxy {}
DefaultProxy.create().content; // $ExpectType object | undefined
class BookProxy extends ObjectProxy<Book> {
private readonly baz = 'baz';
getTitle() {
return this.get('title');
}
getPropertiesTitleSubtitle() {
return this.getProperties('title', 'subtitle');
}
}
const book = BookProxy.create();
book.content; // $ExpectType Book | undefined
book.get("unknownProperty"); // $ExpectError
book.get("title"); // $ExpectType string | undefined
book.getTitle(); // $ExpectType string | undefined
book.getProperties("title", "unknownProperty"); // $ExpectError
book.getProperties("title", "subtitle"); // $ExpectType Pick<Partial<UnwrapComputedPropertyGetters<Book>>, "title" | "subtitle">
book.getPropertiesTitleSubtitle(); // $ExpectType Pick<Partial<UnwrapComputedPropertyGetters<Book>>, "title" | "subtitle">
book.getProperties(["subtitle", "chapters"]); // $ExpectType Pick<Partial<UnwrapComputedPropertyGetters<Book>>, "subtitle" | "chapters">
book.getProperties(["title", "unknownProperty"]); // $ExpectError
book.get("baz"); // $ExpectError

View File

@ -49,6 +49,7 @@
"test/extend.ts",
"test/object.ts",
"test/observable.ts",
"test/proxy.ts",
"test/reopen.ts"
]
}