Skip to content

Commit e052eb1

Browse files
committed
Merge pull request #7621 from Microsoft/dropInferenceLimit
drop inference depth limit
2 parents cc8277c + 6f37d31 commit e052eb1

File tree

5 files changed

+347
-6
lines changed

5 files changed

+347
-6
lines changed

src/compiler/checker.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6673,7 +6673,6 @@ namespace ts {
66736673
function inferTypes(context: InferenceContext, source: Type, target: Type) {
66746674
let sourceStack: Type[];
66756675
let targetStack: Type[];
6676-
const maxDepth = 5;
66776676
let depth = 0;
66786677
let inferiority = 0;
66796678
const visited: Map<boolean> = {};
@@ -6802,11 +6801,6 @@ namespace ts {
68026801
if (isInProcess(source, target)) {
68036802
return;
68046803
}
6805-
// we delibirately limit the depth we examine to infer types: this speeds up the overall inference process
6806-
// and user rarely expects inferences to be made from the deeply nested constituents.
6807-
if (depth > maxDepth) {
6808-
return;
6809-
}
68106804
if (isDeeplyNestedGeneric(source, sourceStack, depth) && isDeeplyNestedGeneric(target, targetStack, depth)) {
68116805
return;
68126806
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
//// [tests/cases/compiler/inferenceLimit.ts] ////
2+
3+
//// [file1.ts]
4+
"use strict";
5+
import * as MyModule from "./mymodule";
6+
7+
export class BrokenClass {
8+
9+
constructor() {}
10+
11+
public brokenMethod(field: string, value: string) {
12+
return new Promise<Array<MyModule.MyModel>>((resolve, reject) => {
13+
14+
let result: Array<MyModule.MyModel> = [];
15+
16+
let populateItems = (order) => {
17+
return new Promise((resolve, reject) => {
18+
this.doStuff(order.id)
19+
.then((items) => {
20+
order.items = items;
21+
resolve(order);
22+
});
23+
});
24+
};
25+
26+
return Promise.all(result.map(populateItems))
27+
.then((orders: Array<MyModule.MyModel>) => {
28+
resolve(orders);
29+
});
30+
});
31+
}
32+
33+
public async doStuff(id: number) {
34+
return;
35+
}
36+
}
37+
38+
//// [mymodule.ts]
39+
export interface MyModel {
40+
id: number;
41+
}
42+
43+
//// [mymodule.js]
44+
"use strict";
45+
//// [file1.js]
46+
"use strict";
47+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
48+
return new (P || (P = Promise))(function (resolve, reject) {
49+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
50+
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
51+
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
52+
step((generator = generator.apply(thisArg, _arguments)).next());
53+
});
54+
};
55+
class BrokenClass {
56+
constructor() {
57+
}
58+
brokenMethod(field, value) {
59+
return new Promise((resolve, reject) => {
60+
let result = [];
61+
let populateItems = (order) => {
62+
return new Promise((resolve, reject) => {
63+
this.doStuff(order.id)
64+
.then((items) => {
65+
order.items = items;
66+
resolve(order);
67+
});
68+
});
69+
};
70+
return Promise.all(result.map(populateItems))
71+
.then((orders) => {
72+
resolve(orders);
73+
});
74+
});
75+
}
76+
doStuff(id) {
77+
return __awaiter(this, void 0, void 0, function* () {
78+
return;
79+
});
80+
}
81+
}
82+
exports.BrokenClass = BrokenClass;
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
=== tests/cases/compiler/file1.ts ===
2+
"use strict";
3+
import * as MyModule from "./mymodule";
4+
>MyModule : Symbol(MyModule, Decl(file1.ts, 1, 6))
5+
6+
export class BrokenClass {
7+
>BrokenClass : Symbol(BrokenClass, Decl(file1.ts, 1, 39))
8+
9+
constructor() {}
10+
11+
public brokenMethod(field: string, value: string) {
12+
>brokenMethod : Symbol(BrokenClass.brokenMethod, Decl(file1.ts, 5, 18))
13+
>field : Symbol(field, Decl(file1.ts, 7, 22))
14+
>value : Symbol(value, Decl(file1.ts, 7, 36))
15+
16+
return new Promise<Array<MyModule.MyModel>>((resolve, reject) => {
17+
>Promise : Symbol(Promise, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
18+
>Array : Symbol(Array, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
19+
>MyModule : Symbol(MyModule, Decl(file1.ts, 1, 6))
20+
>MyModel : Symbol(MyModule.MyModel, Decl(mymodule.ts, 0, 0))
21+
>resolve : Symbol(resolve, Decl(file1.ts, 8, 47))
22+
>reject : Symbol(reject, Decl(file1.ts, 8, 55))
23+
24+
let result: Array<MyModule.MyModel> = [];
25+
>result : Symbol(result, Decl(file1.ts, 10, 7))
26+
>Array : Symbol(Array, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
27+
>MyModule : Symbol(MyModule, Decl(file1.ts, 1, 6))
28+
>MyModel : Symbol(MyModule.MyModel, Decl(mymodule.ts, 0, 0))
29+
30+
let populateItems = (order) => {
31+
>populateItems : Symbol(populateItems, Decl(file1.ts, 12, 7))
32+
>order : Symbol(order, Decl(file1.ts, 12, 25))
33+
34+
return new Promise((resolve, reject) => {
35+
>Promise : Symbol(Promise, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
36+
>resolve : Symbol(resolve, Decl(file1.ts, 13, 26))
37+
>reject : Symbol(reject, Decl(file1.ts, 13, 34))
38+
39+
this.doStuff(order.id)
40+
>this.doStuff(order.id) .then : Symbol(Promise.then, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
41+
>this.doStuff : Symbol(BrokenClass.doStuff, Decl(file1.ts, 27, 3))
42+
>this : Symbol(BrokenClass, Decl(file1.ts, 1, 39))
43+
>doStuff : Symbol(BrokenClass.doStuff, Decl(file1.ts, 27, 3))
44+
>order : Symbol(order, Decl(file1.ts, 12, 25))
45+
46+
.then((items) => {
47+
>then : Symbol(Promise.then, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
48+
>items : Symbol(items, Decl(file1.ts, 15, 17))
49+
50+
order.items = items;
51+
>order : Symbol(order, Decl(file1.ts, 12, 25))
52+
>items : Symbol(items, Decl(file1.ts, 15, 17))
53+
54+
resolve(order);
55+
>resolve : Symbol(resolve, Decl(file1.ts, 13, 26))
56+
>order : Symbol(order, Decl(file1.ts, 12, 25))
57+
58+
});
59+
});
60+
};
61+
62+
return Promise.all(result.map(populateItems))
63+
>Promise.all(result.map(populateItems)) .then : Symbol(Promise.then, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
64+
>Promise.all : Symbol(PromiseConstructor.all, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
65+
>Promise : Symbol(Promise, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
66+
>all : Symbol(PromiseConstructor.all, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
67+
>result.map : Symbol(Array.map, Decl(lib.d.ts, --, --))
68+
>result : Symbol(result, Decl(file1.ts, 10, 7))
69+
>map : Symbol(Array.map, Decl(lib.d.ts, --, --))
70+
>populateItems : Symbol(populateItems, Decl(file1.ts, 12, 7))
71+
72+
.then((orders: Array<MyModule.MyModel>) => {
73+
>then : Symbol(Promise.then, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
74+
>orders : Symbol(orders, Decl(file1.ts, 23, 13))
75+
>Array : Symbol(Array, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
76+
>MyModule : Symbol(MyModule, Decl(file1.ts, 1, 6))
77+
>MyModel : Symbol(MyModule.MyModel, Decl(mymodule.ts, 0, 0))
78+
79+
resolve(orders);
80+
>resolve : Symbol(resolve, Decl(file1.ts, 8, 47))
81+
>orders : Symbol(orders, Decl(file1.ts, 23, 13))
82+
83+
});
84+
});
85+
}
86+
87+
public async doStuff(id: number) {
88+
>doStuff : Symbol(BrokenClass.doStuff, Decl(file1.ts, 27, 3))
89+
>id : Symbol(id, Decl(file1.ts, 29, 23))
90+
91+
return;
92+
}
93+
}
94+
95+
=== tests/cases/compiler/mymodule.ts ===
96+
export interface MyModel {
97+
>MyModel : Symbol(MyModel, Decl(mymodule.ts, 0, 0))
98+
99+
id: number;
100+
>id : Symbol(MyModel.id, Decl(mymodule.ts, 0, 26))
101+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
=== tests/cases/compiler/file1.ts ===
2+
"use strict";
3+
>"use strict" : string
4+
5+
import * as MyModule from "./mymodule";
6+
>MyModule : typeof MyModule
7+
8+
export class BrokenClass {
9+
>BrokenClass : BrokenClass
10+
11+
constructor() {}
12+
13+
public brokenMethod(field: string, value: string) {
14+
>brokenMethod : (field: string, value: string) => Promise<MyModule.MyModel[]>
15+
>field : string
16+
>value : string
17+
18+
return new Promise<Array<MyModule.MyModel>>((resolve, reject) => {
19+
>new Promise<Array<MyModule.MyModel>>((resolve, reject) => { let result: Array<MyModule.MyModel> = []; let populateItems = (order) => { return new Promise((resolve, reject) => { this.doStuff(order.id) .then((items) => { order.items = items; resolve(order); }); }); }; return Promise.all(result.map(populateItems)) .then((orders: Array<MyModule.MyModel>) => { resolve(orders); }); }) : Promise<MyModule.MyModel[]>
20+
>Promise : PromiseConstructor
21+
>Array : T[]
22+
>MyModule : any
23+
>MyModel : MyModule.MyModel
24+
>(resolve, reject) => { let result: Array<MyModule.MyModel> = []; let populateItems = (order) => { return new Promise((resolve, reject) => { this.doStuff(order.id) .then((items) => { order.items = items; resolve(order); }); }); }; return Promise.all(result.map(populateItems)) .then((orders: Array<MyModule.MyModel>) => { resolve(orders); }); } : (resolve: (value?: MyModule.MyModel[] | PromiseLike<MyModule.MyModel[]>) => void, reject: (reason?: any) => void) => Promise<void>
25+
>resolve : (value?: MyModule.MyModel[] | PromiseLike<MyModule.MyModel[]>) => void
26+
>reject : (reason?: any) => void
27+
28+
let result: Array<MyModule.MyModel> = [];
29+
>result : MyModule.MyModel[]
30+
>Array : T[]
31+
>MyModule : any
32+
>MyModel : MyModule.MyModel
33+
>[] : undefined[]
34+
35+
let populateItems = (order) => {
36+
>populateItems : (order: any) => Promise<{}>
37+
>(order) => { return new Promise((resolve, reject) => { this.doStuff(order.id) .then((items) => { order.items = items; resolve(order); }); }); } : (order: any) => Promise<{}>
38+
>order : any
39+
40+
return new Promise((resolve, reject) => {
41+
>new Promise((resolve, reject) => { this.doStuff(order.id) .then((items) => { order.items = items; resolve(order); }); }) : Promise<{}>
42+
>Promise : PromiseConstructor
43+
>(resolve, reject) => { this.doStuff(order.id) .then((items) => { order.items = items; resolve(order); }); } : (resolve: (value?: {} | PromiseLike<{}>) => void, reject: (reason?: any) => void) => void
44+
>resolve : (value?: {} | PromiseLike<{}>) => void
45+
>reject : (reason?: any) => void
46+
47+
this.doStuff(order.id)
48+
>this.doStuff(order.id) .then((items) => { order.items = items; resolve(order); }) : Promise<void>
49+
>this.doStuff(order.id) .then : { <TResult>(onfulfilled?: (value: void) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled?: (value: void) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => void): Promise<TResult>; }
50+
>this.doStuff(order.id) : Promise<void>
51+
>this.doStuff : (id: number) => Promise<void>
52+
>this : this
53+
>doStuff : (id: number) => Promise<void>
54+
>order.id : any
55+
>order : any
56+
>id : any
57+
58+
.then((items) => {
59+
>then : { <TResult>(onfulfilled?: (value: void) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled?: (value: void) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => void): Promise<TResult>; }
60+
>(items) => { order.items = items; resolve(order); } : (items: void) => void
61+
>items : void
62+
63+
order.items = items;
64+
>order.items = items : void
65+
>order.items : any
66+
>order : any
67+
>items : any
68+
>items : void
69+
70+
resolve(order);
71+
>resolve(order) : void
72+
>resolve : (value?: {} | PromiseLike<{}>) => void
73+
>order : any
74+
75+
});
76+
});
77+
};
78+
79+
return Promise.all(result.map(populateItems))
80+
>Promise.all(result.map(populateItems)) .then((orders: Array<MyModule.MyModel>) => { resolve(orders); }) : Promise<void>
81+
>Promise.all(result.map(populateItems)) .then : { <TResult>(onfulfilled?: (value: {}[]) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled?: (value: {}[]) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => void): Promise<TResult>; }
82+
>Promise.all(result.map(populateItems)) : Promise<{}[]>
83+
>Promise.all : { <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>, T9 | PromiseLike<T9>, T10 | PromiseLike<T10>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>; <T1, T2, T3, T4, T5, T6, T7, T8, T9>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>, T9 | PromiseLike<T9>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>; <T1, T2, T3, T4, T5, T6, T7, T8>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8]>; <T1, T2, T3, T4, T5, T6, T7>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>]): Promise<[T1, T2, T3, T4, T5, T6, T7]>; <T1, T2, T3, T4, T5, T6>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>]): Promise<[T1, T2, T3, T4, T5, T6]>; <T1, T2, T3, T4, T5>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>]): Promise<[T1, T2, T3, T4, T5]>; <T1, T2, T3, T4>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>]): Promise<[T1, T2, T3, T4]>; <T1, T2, T3>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>]): Promise<[T1, T2, T3]>; <T1, T2>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>]): Promise<[T1, T2]>; <TAll>(values: Iterable<TAll | PromiseLike<TAll>>): Promise<TAll[]>; }
84+
>Promise : PromiseConstructor
85+
>all : { <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>, T9 | PromiseLike<T9>, T10 | PromiseLike<T10>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>; <T1, T2, T3, T4, T5, T6, T7, T8, T9>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>, T9 | PromiseLike<T9>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>; <T1, T2, T3, T4, T5, T6, T7, T8>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8]>; <T1, T2, T3, T4, T5, T6, T7>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>]): Promise<[T1, T2, T3, T4, T5, T6, T7]>; <T1, T2, T3, T4, T5, T6>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>]): Promise<[T1, T2, T3, T4, T5, T6]>; <T1, T2, T3, T4, T5>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>]): Promise<[T1, T2, T3, T4, T5]>; <T1, T2, T3, T4>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>]): Promise<[T1, T2, T3, T4]>; <T1, T2, T3>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>]): Promise<[T1, T2, T3]>; <T1, T2>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>]): Promise<[T1, T2]>; <TAll>(values: Iterable<TAll | PromiseLike<TAll>>): Promise<TAll[]>; }
86+
>result.map(populateItems) : Promise<{}>[]
87+
>result.map : <U>(callbackfn: (value: MyModule.MyModel, index: number, array: MyModule.MyModel[]) => U, thisArg?: any) => U[]
88+
>result : MyModule.MyModel[]
89+
>map : <U>(callbackfn: (value: MyModule.MyModel, index: number, array: MyModule.MyModel[]) => U, thisArg?: any) => U[]
90+
>populateItems : (order: any) => Promise<{}>
91+
92+
.then((orders: Array<MyModule.MyModel>) => {
93+
>then : { <TResult>(onfulfilled?: (value: {}[]) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled?: (value: {}[]) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => void): Promise<TResult>; }
94+
>(orders: Array<MyModule.MyModel>) => { resolve(orders); } : (orders: MyModule.MyModel[]) => void
95+
>orders : MyModule.MyModel[]
96+
>Array : T[]
97+
>MyModule : any
98+
>MyModel : MyModule.MyModel
99+
100+
resolve(orders);
101+
>resolve(orders) : void
102+
>resolve : (value?: MyModule.MyModel[] | PromiseLike<MyModule.MyModel[]>) => void
103+
>orders : MyModule.MyModel[]
104+
105+
});
106+
});
107+
}
108+
109+
public async doStuff(id: number) {
110+
>doStuff : (id: number) => Promise<void>
111+
>id : number
112+
113+
return;
114+
}
115+
}
116+
117+
=== tests/cases/compiler/mymodule.ts ===
118+
export interface MyModel {
119+
>MyModel : MyModel
120+
121+
id: number;
122+
>id : number
123+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// @target: es6
2+
// @module: commonjs
3+
// @filename: file1.ts
4+
"use strict";
5+
import * as MyModule from "./mymodule";
6+
7+
export class BrokenClass {
8+
9+
constructor() {}
10+
11+
public brokenMethod(field: string, value: string) {
12+
return new Promise<Array<MyModule.MyModel>>((resolve, reject) => {
13+
14+
let result: Array<MyModule.MyModel> = [];
15+
16+
let populateItems = (order) => {
17+
return new Promise((resolve, reject) => {
18+
this.doStuff(order.id)
19+
.then((items) => {
20+
order.items = items;
21+
resolve(order);
22+
});
23+
});
24+
};
25+
26+
return Promise.all(result.map(populateItems))
27+
.then((orders: Array<MyModule.MyModel>) => {
28+
resolve(orders);
29+
});
30+
});
31+
}
32+
33+
public async doStuff(id: number) {
34+
return;
35+
}
36+
}
37+
38+
// @filename: mymodule.ts
39+
export interface MyModel {
40+
id: number;
41+
}

0 commit comments

Comments
 (0)