Skip to content

tsc 3.6.3: Promise.all breaks with some union type #33562

Closed
@paul-marechal

Description

@paul-marechal

TypeScript Version: 3.6.3

Search Terms: promise all

Code

type MaybePromise<T> = T | Promise<T> | PromiseLike<T>

function MaybePromise<T>(value: T): MaybePromise<T> {
    return Promise.resolve(value)
}

async function main() {
    let aaa: number
    let bbb: string
    [
        aaa,
        bbb,
    ] = await Promise.all([
        MaybePromise(1),
        MaybePromise('2'),
        MaybePromise(true),
    ])
}

tsconfig:

{
  "compilerOptions": {
    "strict": true,
    "target": "es5",
    "module": "commonjs",
    "lib": [
      "es6"
    ]
  }

Expected behavior:

Code should compile without errors.

Actual behavior:

Error:

test.ts:11:9 - error TS2322: Type 'number | Promise<1>' is not assignable to type 'number'.
  Type 'Promise<1>' is not assignable to type 'number'.
test.ts:12:9 - error TS2322: Type 'string | Promise<"2">' is not assignable to type 'string'.
  Type 'Promise<"2">' is not assignable to type 'string'.

Code compiles well with 3.5.3, but not 3.6.3 nor 3.7.0-dev.20190922.

Playground Link:

Weirdly enough, on the playground the return value of Promise.all is not a tuple but a list.

https://www.typescriptlang.org/play/#code/C4TwDgpgBAsghiARhACgJwPYFsCWBnCAHgBUA+KAXimKgB8p1t8iy6HNcCAZHAaxdIAoQQDMArgDsAxsBwYJsBMkacBACgBucADZiIALmoBKQ-CSoOzEuQDegqA6hoIwMWgUrmAOmd4M2jQhNHT0jQQBfYTg8EGkocWlZeSgsOBwJNSMoO0cobRcoOCLDCTEsZDR7R3zgKER6wzxgNHSAcyqHAG0O3MKigBoe3PrEQdyAXUpCgHc02s8CLx1tNW7exzNlSwI1AEYjMfXFcwWggHIAJjODoY2lCyYd5tDDh3GwyKA

Related Issues:

Metadata

Metadata

Assignees

Labels

Fix AvailableA PR has been opened for this issueNeeds InvestigationThis issue needs a team member to investigate its status.RescheduledThis issue was previously scheduled to an earlier milestone

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions