Skip to content

Commit 6dbec02

Browse files
authored
Add extra test cases for the Awaited type (#53090)
1 parent df1ddb7 commit 6dbec02

File tree

5 files changed

+231
-1
lines changed

5 files changed

+231
-1
lines changed

Diff for: tests/baselines/reference/awaitedType.errors.txt

+28-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
tests/cases/compiler/awaitedType.ts(22,12): error TS2589: Type instantiation is excessively deep and possibly infinite.
22
tests/cases/compiler/awaitedType.ts(26,12): error TS2589: Type instantiation is excessively deep and possibly infinite.
3+
tests/cases/compiler/awaitedType.ts(236,28): error TS2493: Tuple type '[number]' of length '1' has no element at index '1'.
34

45

5-
==== tests/cases/compiler/awaitedType.ts (2 errors) ====
6+
==== tests/cases/compiler/awaitedType.ts (3 errors) ====
67
type T1 = Awaited<number>;
78
type T2 = Awaited<Promise<number>>;
89
type T3 = Awaited<number | Promise<number>>;
@@ -234,4 +235,30 @@ tests/cases/compiler/awaitedType.ts(26,12): error TS2589: Type instantiation is
234235
const itsTwo1 = await findManyWrapper({ select: "foo" });
235236
const itsTwo2 = await findManyWrapper({ include: "bar" });
236237
}
238+
239+
// repro from #41831
240+
241+
{
242+
const promises = [Promise.resolve(0)] as const
243+
244+
Promise.all(promises).then((results) => {
245+
const first = results[0]
246+
const second = results[1] // error
247+
~
248+
!!! error TS2493: Tuple type '[number]' of length '1' has no element at index '1'.
249+
})
250+
}
251+
252+
// repro from #40330
253+
254+
async function test40330() {
255+
256+
const promiseNumber = Promise.resolve(1);
257+
const promiseVoid = async () => {}
258+
259+
const res = await Promise.all([
260+
promiseNumber,
261+
...[promiseVoid()]
262+
])
263+
}
237264

Diff for: tests/baselines/reference/awaitedType.js

+41
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,30 @@ async function mainFindMany() {
226226
const itsTwo1 = await findManyWrapper({ select: "foo" });
227227
const itsTwo2 = await findManyWrapper({ include: "bar" });
228228
}
229+
230+
// repro from #41831
231+
232+
{
233+
const promises = [Promise.resolve(0)] as const
234+
235+
Promise.all(promises).then((results) => {
236+
const first = results[0]
237+
const second = results[1] // error
238+
})
239+
}
240+
241+
// repro from #40330
242+
243+
async function test40330() {
244+
245+
const promiseNumber = Promise.resolve(1);
246+
const promiseVoid = async () => {}
247+
248+
const res = await Promise.all([
249+
promiseNumber,
250+
...[promiseVoid()]
251+
])
252+
}
229253

230254

231255
//// [awaitedType.js]
@@ -355,3 +379,20 @@ async function mainFindMany() {
355379
const itsTwo1 = await findManyWrapper({ select: "foo" });
356380
const itsTwo2 = await findManyWrapper({ include: "bar" });
357381
}
382+
// repro from #41831
383+
{
384+
const promises = [Promise.resolve(0)];
385+
Promise.all(promises).then((results) => {
386+
const first = results[0];
387+
const second = results[1]; // error
388+
});
389+
}
390+
// repro from #40330
391+
async function test40330() {
392+
const promiseNumber = Promise.resolve(1);
393+
const promiseVoid = async () => { };
394+
const res = await Promise.all([
395+
promiseNumber,
396+
...[promiseVoid()]
397+
]);
398+
}

Diff for: tests/baselines/reference/awaitedType.symbols

+60
Original file line numberDiff line numberDiff line change
@@ -596,3 +596,63 @@ async function mainFindMany() {
596596
>include : Symbol(include, Decl(awaitedType.ts, 225, 41))
597597
}
598598

599+
// repro from #41831
600+
601+
{
602+
const promises = [Promise.resolve(0)] as const
603+
>promises : Symbol(promises, Decl(awaitedType.ts, 231, 7))
604+
>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
605+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
606+
>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
607+
>const : Symbol(const)
608+
609+
Promise.all(promises).then((results) => {
610+
>Promise.all(promises).then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --))
611+
>Promise.all : Symbol(PromiseConstructor.all, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
612+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
613+
>all : Symbol(PromiseConstructor.all, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
614+
>promises : Symbol(promises, Decl(awaitedType.ts, 231, 7))
615+
>then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --))
616+
>results : Symbol(results, Decl(awaitedType.ts, 233, 30))
617+
618+
const first = results[0]
619+
>first : Symbol(first, Decl(awaitedType.ts, 234, 9))
620+
>results : Symbol(results, Decl(awaitedType.ts, 233, 30))
621+
>0 : Symbol(0)
622+
623+
const second = results[1] // error
624+
>second : Symbol(second, Decl(awaitedType.ts, 235, 9))
625+
>results : Symbol(results, Decl(awaitedType.ts, 233, 30))
626+
627+
})
628+
}
629+
630+
// repro from #40330
631+
632+
async function test40330() {
633+
>test40330 : Symbol(test40330, Decl(awaitedType.ts, 237, 1))
634+
635+
const promiseNumber = Promise.resolve(1);
636+
>promiseNumber : Symbol(promiseNumber, Decl(awaitedType.ts, 243, 9))
637+
>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
638+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
639+
>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
640+
641+
const promiseVoid = async () => {}
642+
>promiseVoid : Symbol(promiseVoid, Decl(awaitedType.ts, 244, 9))
643+
644+
const res = await Promise.all([
645+
>res : Symbol(res, Decl(awaitedType.ts, 246, 9))
646+
>Promise.all : Symbol(PromiseConstructor.all, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
647+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
648+
>all : Symbol(PromiseConstructor.all, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
649+
650+
promiseNumber,
651+
>promiseNumber : Symbol(promiseNumber, Decl(awaitedType.ts, 243, 9))
652+
653+
...[promiseVoid()]
654+
>promiseVoid : Symbol(promiseVoid, Decl(awaitedType.ts, 244, 9))
655+
656+
])
657+
}
658+

Diff for: tests/baselines/reference/awaitedType.types

+78
Original file line numberDiff line numberDiff line change
@@ -542,3 +542,81 @@ async function mainFindMany() {
542542
>"bar" : "bar"
543543
}
544544

545+
// repro from #41831
546+
547+
{
548+
const promises = [Promise.resolve(0)] as const
549+
>promises : readonly [Promise<number>]
550+
>[Promise.resolve(0)] as const : readonly [Promise<number>]
551+
>[Promise.resolve(0)] : readonly [Promise<number>]
552+
>Promise.resolve(0) : Promise<number>
553+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T>(value: T | PromiseLike<T>): Promise<Awaited<T>>; }
554+
>Promise : PromiseConstructor
555+
>resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T>(value: T | PromiseLike<T>): Promise<Awaited<T>>; }
556+
>0 : 0
557+
558+
Promise.all(promises).then((results) => {
559+
>Promise.all(promises).then((results) => { const first = results[0] const second = results[1] // error }) : Promise<void>
560+
>Promise.all(promises).then : <TResult1 = [number], TResult2 = never>(onfulfilled?: (value: [number]) => TResult1 | PromiseLike<TResult1>, onrejected?: (reason: any) => TResult2 | PromiseLike<TResult2>) => Promise<TResult1 | TResult2>
561+
>Promise.all(promises) : Promise<[number]>
562+
>Promise.all : { <T>(values: Iterable<T | PromiseLike<T>>): Promise<Awaited<T>[]>; <T extends [] | readonly unknown[]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]>; }>; }
563+
>Promise : PromiseConstructor
564+
>all : { <T>(values: Iterable<T | PromiseLike<T>>): Promise<Awaited<T>[]>; <T extends [] | readonly unknown[]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]>; }>; }
565+
>promises : readonly [Promise<number>]
566+
>then : <TResult1 = [number], TResult2 = never>(onfulfilled?: (value: [number]) => TResult1 | PromiseLike<TResult1>, onrejected?: (reason: any) => TResult2 | PromiseLike<TResult2>) => Promise<TResult1 | TResult2>
567+
>(results) => { const first = results[0] const second = results[1] // error } : (results: [number]) => void
568+
>results : [number]
569+
570+
const first = results[0]
571+
>first : number
572+
>results[0] : number
573+
>results : [number]
574+
>0 : 0
575+
576+
const second = results[1] // error
577+
>second : undefined
578+
>results[1] : undefined
579+
>results : [number]
580+
>1 : 1
581+
582+
})
583+
}
584+
585+
// repro from #40330
586+
587+
async function test40330() {
588+
>test40330 : () => Promise<void>
589+
590+
const promiseNumber = Promise.resolve(1);
591+
>promiseNumber : Promise<number>
592+
>Promise.resolve(1) : Promise<number>
593+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T>(value: T | PromiseLike<T>): Promise<Awaited<T>>; }
594+
>Promise : PromiseConstructor
595+
>resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T>(value: T | PromiseLike<T>): Promise<Awaited<T>>; }
596+
>1 : 1
597+
598+
const promiseVoid = async () => {}
599+
>promiseVoid : () => Promise<void>
600+
>async () => {} : () => Promise<void>
601+
602+
const res = await Promise.all([
603+
>res : [number, ...void[]]
604+
>await Promise.all([ promiseNumber, ...[promiseVoid()] ]) : [number, ...void[]]
605+
>Promise.all([ promiseNumber, ...[promiseVoid()] ]) : Promise<[number, ...void[]]>
606+
>Promise.all : { <T>(values: Iterable<T | PromiseLike<T>>): Promise<Awaited<T>[]>; <T extends [] | readonly unknown[]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]>; }>; }
607+
>Promise : PromiseConstructor
608+
>all : { <T>(values: Iterable<T | PromiseLike<T>>): Promise<Awaited<T>[]>; <T extends [] | readonly unknown[]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]>; }>; }
609+
>[ promiseNumber, ...[promiseVoid()] ] : [Promise<number>, ...Promise<void>[]]
610+
611+
promiseNumber,
612+
>promiseNumber : Promise<number>
613+
614+
...[promiseVoid()]
615+
>...[promiseVoid()] : Promise<void>
616+
>[promiseVoid()] : Promise<void>[]
617+
>promiseVoid() : Promise<void>
618+
>promiseVoid : () => Promise<void>
619+
620+
])
621+
}
622+

Diff for: tests/cases/compiler/awaitedType.ts

+24
Original file line numberDiff line numberDiff line change
@@ -228,3 +228,27 @@ async function mainFindMany() {
228228
const itsTwo1 = await findManyWrapper({ select: "foo" });
229229
const itsTwo2 = await findManyWrapper({ include: "bar" });
230230
}
231+
232+
// repro from #41831
233+
234+
{
235+
const promises = [Promise.resolve(0)] as const
236+
237+
Promise.all(promises).then((results) => {
238+
const first = results[0]
239+
const second = results[1] // error
240+
})
241+
}
242+
243+
// repro from #40330
244+
245+
async function test40330() {
246+
247+
const promiseNumber = Promise.resolve(1);
248+
const promiseVoid = async () => {}
249+
250+
const res = await Promise.all([
251+
promiseNumber,
252+
...[promiseVoid()]
253+
])
254+
}

0 commit comments

Comments
 (0)