Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions types/ember__object/proxy.d.ts
Original file line number Diff line number Diff line change
@@ -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>;
}
38 changes: 38 additions & 0 deletions types/ember__object/test/proxy.ts
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions types/ember__object/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
"test/extend.ts",
"test/object.ts",
"test/observable.ts",
"test/proxy.ts",
"test/reopen.ts"
]
}