microsoft / microsoft/TypeScript

Optional type as required if used in one branch of nested promises

Aperta
#42,293 2 commenti 0 reazioni 1 assegnatario Vedi su GitHub

@rbuckton ci sta già lavorando.

Dal 12/1/2021.

Needs Investigation Rescheduled
Lingua principale
Go
Stelle
111k
Fork
14.3k
Merge medio
2g 4h
PR unite (30g)
132

Descrizione

Bug Report

The system falsely reports an optional property as required if one branch returns the one optional property, but a second branch skips it and returns another optional property.

🔎 Search Terms

promise, catch, optional property

🕗 Version & Regression Information
  • 3.1.4
  • nightly (4.2.0-dev.20210112)
⏯ Playground Link

This playground shows 3 examples of the code posted below, where I commented out specific parts of the code. If you remove the comments in a variant, it will show the error:

https://www.typescriptlang.org/play?#code/KYDwDg9gTgLgBDAnmYcAiBDGG4F44AKUEAtgJYDOwAPAN4BQcTcUwAjgK5msAmREKWIgBccAHYcSAI2BQA3I2YCYZCGIwAbfoKQBGAPyiJ02QuZxlq9VuI7EAJkPjJM+fQC+APjNx6AYzUKeAA3DCgyDCkNYFFMbDxCYnIqADpWCggNYOAACnsASnoUmAALYDEcnLBiACtgPxh8vE84BiYyADM4HIBCaog6hqa25lYYDigxVsVzVk5uYD5bWSRRAAYAGhmlMBU1TW0VxF1Re03t9x93OGANKmnzAHpHsYmp-mTgNOAMrNyAbQAuvlimUKjkmrgWiNZsBxpMHuZRuwuLxDkJ1lskTs9tZ0Uh7KJdOdsZdts93Pkrh5Cik-Fg-CVKpCWjkRpZ9jYBEcTnBiViWCiFktuRi4OdKVT6P5AiEwhEosBCegsDh8B9KF90plsnlaaVypV+oNGs1EZ1un1avVTTDBfCpnamHNUYt8SJxQKno8OXjlkJeWcvXAyUxrrd7nbXgiNaltX8ckCQQbwSzEbCHemkS7he7MdtzL6Dv6CUSSUjQ8xKdTKUV6TBGcyzWzFEWuXZefzFDm0SWPRL8lKZWIgnBQuFItEAMyxVUJWNan463IFIopo3WoZmkYW3rGm3DbbRx0FwXzXui1ae09t92B8thq43O6oKNwt6JUia76-XVJ0GGhC26nseWawuebp9vm2JMLefbKl2pI+GGUphjS9DPHSDJMkBULdAwzywbsVjFpexxllshFnq6Ip2PmFKDgow6-F8GgQAA5jk44KtEGxjvKk5Knx3GCVOhRAA

💻 Code
export type Data = Promise<{
    requiredProperty: number;
    optionalProperty1?: number;
    optionalProperty2?: number;
}>;
  
const variable: Data = Promise.resolve(2)
.then((project) => {
  if (!project) {
    return {
      requiredProperty: 0,
      optionalProperty1: 20,
    };
  } else {
    return Promise.resolve([]).then(() => {
      return {
        requiredProperty: 0,
        optionalProperty2: 10,
      };
    });
  }
})
.catch(() => ({
  optionalProperty1: 10,
  requiredProperty: 0,
}));
🙁 Actual behavior
⠏ (3/3) Building...
test.ts:7:7 - error TS2322: Type 'Promise<number | { optionalProperty1: number; requiredProperty: number; }>' is not assignable to type 'Data'.
  Type 'number | { optionalProperty1: number; requiredProperty: number; }' is not assignable to type '{ requiredProperty: number; optionalProperty1?: number | undefined; optionalProperty2?: number | undefined; }'.
    Type 'number' is not assignable to type '{ requiredProperty: number; optionalProperty1?: number | undefined; optionalProperty2?: number | undefined; }'.

7 const variable: Data = Promise.resolve(2)
        ~~~~~~~~


test.ts:8:7 - error TS2345: Argument of type '(project: number) => Promise<{ requiredProperty: number; optionalProperty2: number; }> | { requiredProperty: number; optionalProperty1: number; }' is not assignable to parameter of type '(value: number) => { requiredProperty: number; optionalProperty2: number; } | PromiseLike<{ requiredProperty: number; optionalProperty2: number; }>'.
  Type 'Promise<{ requiredProperty: number; optionalProperty2: number; }> | { requiredProperty: number; optionalProperty1: number; }' is not assignable to type '{ requiredProperty: number; optionalProperty2: number; } | PromiseLike<{ requiredProperty: number; optionalProperty2: number; }>'.
    Type '{ requiredProperty: number; optionalProperty1: number; }' is not assignable to type '{ requiredProperty: number; optionalProperty2: number; } | PromiseLike<{ requiredProperty: number; optionalProperty2: number; }>'.
      Property 'optionalProperty2' is missing in type '{ requiredProperty: number; optionalProperty1: number; }' but required in type '{ requiredProperty: number; optionalProperty2: number; }'.

8 .then((project) => {
        ~~~~~~~~~~~~~~

  test.ts:18:9
    18         optionalProperty2: 10,
               ~~~~~~~~~~~~~~~~~~~~~
    'optionalProperty2' is declared here.

ℹ (3/3) Building...found 2 errors
🙂 Expected behavior

Should work without reporting any errors.

Please explain if this was intended in any way.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.