[ember] new types for Ember.Object.create

fix: remove unused code

fix: consistent treatment of zero-argument Ember.Object.create
This commit is contained in:
Mike North
2018-09-02 10:40:49 -07:00
parent ccf9122902
commit 50599f24b8
4 changed files with 42 additions and 33 deletions

View File

@@ -848,36 +848,31 @@ declare module 'ember' {
**/
toString(): string;
static create<Instance>(this: EmberClassConstructor<Instance>): Fix<Instance>;
static create<Class extends typeof Ember.CoreObject>(this: Class): InstanceType<Class>;
static create<Instance, Args, T1 extends EmberInstanceArguments<Args>>(
this: EmberClassConstructor<UnwrapComputedPropertyGetters<Args> & Instance>,
arg1: T1 & ThisType<Fix<T1 & Instance>>
): Fix<Instance & T1>;
static create<Class extends typeof Ember.CoreObject,
T1 extends EmberInstanceArguments<UnwrapComputedPropertySetters<InstanceType<Class>>>
>(this: Class,
arg1: T1 & ThisType<T1 & InstanceType<Class>>
): InstanceType<Class> & T1;
static create<
Instance,
Args,
T1 extends EmberInstanceArguments<Args>,
T2 extends EmberInstanceArguments<Args>
>(
this: EmberClassConstructor<UnwrapComputedPropertyGetters<Args> & Instance>,
arg1: T1 & ThisType<Fix<Instance & T1>>,
arg2: T2 & ThisType<Fix<Instance & T1 & T2>>
): Fix<Instance & T1 & T2>;
static create<Class extends typeof Ember.CoreObject,
T1 extends EmberInstanceArguments<UnwrapComputedPropertySetters<InstanceType<Class>>>,
T2 extends EmberInstanceArguments<UnwrapComputedPropertySetters<InstanceType<Class>>>
>(this: Class,
arg1: T1 & ThisType<T1 & InstanceType<Class>>,
arg2: T2 & ThisType<T2 & InstanceType<Class>>
): InstanceType<Class> & T1 & T2;
static create<
Instance,
Args,
T1 extends EmberInstanceArguments<Args>,
T2 extends EmberInstanceArguments<Args>,
T3 extends EmberInstanceArguments<Args>
>(
this: EmberClassConstructor<UnwrapComputedPropertyGetters<Args> & Instance >,
arg1: T1 & ThisType<Fix<Instance & T1>>,
arg2: T2 & ThisType<Fix<Instance & T1 & T2>>,
arg3: T3 & ThisType<Fix<Instance & T1 & T2 & T3>>
): Fix<Instance & T1 & T2 & T3>;
static create<Class extends typeof Ember.CoreObject,
T1 extends EmberInstanceArguments<UnwrapComputedPropertySetters<InstanceType<Class>>>,
T2 extends EmberInstanceArguments<UnwrapComputedPropertySetters<InstanceType<Class>>>,
T3 extends EmberInstanceArguments<UnwrapComputedPropertySetters<InstanceType<Class>>>
>(this: Class,
arg1: T1 & ThisType<T1 & InstanceType<Class>>,
arg2: T2 & ThisType<T2 & InstanceType<Class>>,
arg3: T3 & ThisType<T3 & InstanceType<Class>>
): InstanceType<Class> & T1 & T2 & T3;
static extend<Statics, Instance>(
this: Statics & EmberClassConstructor<Instance>
@@ -3220,7 +3215,7 @@ declare module 'ember' {
* property is not defined but the object implements the `setUnknownProperty`
* method then that will be invoked as well.
*/
function set<T, K extends keyof T, V extends T[K]>(
function set<T, K extends keyof T>(
obj: T,
key: K,
value: UnwrapComputedPropertySetter<T[K]>

View File

@@ -9,4 +9,4 @@ Person.create({}, {}, { firstName: 99 }); // $ExpectError
const p4 = new PersonWithNumberName();
// assertType<number>(p4.get('fullName'));
assertType<Ember.ComputedProperty<string, string>>(p4.fullName); // $ExpectError
// assertType<Ember.ComputedProperty<string, string>>(p4.fullName); // $ExpectError

View File

@@ -1,11 +1,25 @@
import Ember from 'ember';
import { assertType } from './lib/assert';
/**
* Zero-argument case
*/
const o = Ember.Object.create();
// create returns an object
assertType<object>(o);
// object returned by create type-checks as an instance of Ember.Object
assertType<boolean>(o.isDestroyed); // from instance
assertType<boolean>(o.isDestroying); // from instance
assertType<(key: string) => any>(o.get); // from prototype
const o1 = Ember.Object.create({x: 9});
/**
* One-argument case
*/
const o1 = Ember.Object.create({x: 9, y: 'hello', z: false});
assertType<number>(o1.x);
assertType<string>(o1.y);
o1.y; // $ExpectType string
o1.z; // $ExpectType boolean
const obj = Ember.Object.create({ a: 1 }, { b: 2 }, { c: 3 });
assertType<number>(obj.b);
@@ -22,6 +36,7 @@ export class Person extends Ember.Object.extend({
age: number;
}
const p = new Person();
assertType<string>(p.firstName);
assertType<Ember.ComputedProperty<string>>(p.fullName);
assertType<string>(p.get('fullName'));

View File

@@ -29,9 +29,8 @@ assertType<string>(Person2.species);
let tom = Person2.create({
name: 'Tom Dale'
});
let badTom = Person2.create({
name: 99 // $ExpectError
});
let badTom = Person2.create({ name: 99 }); // $ExpectError
let yehuda = Person2.createPerson('Yehuda Katz');