TypeScript icon indicating copy to clipboard operation
TypeScript copied to clipboard

Protected field with same name in two classes messing up type constraint when narrowing array.

Open Jym77 opened this issue 3 years ago • 7 comments

Bug Report

(I'm not even sure how to properly name that issue 🙃 )

🔎 Search Terms

typescript inheritance protected intersection

🕗 Version & Regression Information

Seen it recently in 4.6.2. Update to 4.7.3 without changing the behaviour (and 4.8.0 nightly in the playground). I don't know if it was here before.

  • I was unable to test this on prior versions because this triggered with unrelated change elsewhere in my code

⏯ Playground Link

Playground link with relevant code

💻 Code

class Foo {
  protected foo = 0;
}

class Bar {
  protected foo = 0;
}

type Nothing<V extends Foo> = void;

type Broken<V extends Array<Foo | Bar>> = {
  readonly [P in keyof V]: V[P] extends Foo ? Nothing<V[P]> : never;
};

🙁 Actual behavior

(error located at the V[P] in Nothing<V[P]>)

 Type 'Foo & V[P]' does not satisfy the constraint 'Foo'.
  Property 'foo' is missing in type 'Foo & V[P]' but required in type 'Foo'.

Changing foo from protected to public in either Foo or Bar makes the error disappear.

Removing (or renaming) protected foo = 0 from either Foo or Bar makes the error disappear.

Replacing the Array<Foo | Bar> in Broken by Array<Foo> makes the error disappear.

🙂 Expected behavior

Since V[P] is already in a type guard that is the same as the constraint for Nothing, this should not generate any typing error.

Jym77 avatar Jun 13 '22 14:06 Jym77

Workaround

type Broken<V extends Array<Foo | Bar>> = {
  readonly [P in keyof V]: V[P] extends (infer T extends Foo) ? Nothing<T> : never;
};

RyanCavanaugh avatar Jun 13 '22 18:06 RyanCavanaugh

Thanks. Workaround works fine in the real code too 😄

Jym77 avatar Jun 14 '22 06:06 Jym77

It seems that the workaround breaks api-extractor 😢

Jym77 avatar Jun 20 '22 14:06 Jym77

@typescript-bot bisect good v4.6.4 bad v4.7.4

andrewbranch avatar Jul 06 '22 22:07 andrewbranch

The change between v4.6.4 and v4.7.4 occurred at 787bb9ddb60368f84b1ed1b0971aa2bf79fdec77.

typescript-bot avatar Jul 06 '22 22:07 typescript-bot

Hey this is the second bisect today that blames #48837 😅

andrewbranch avatar Jul 06 '22 23:07 andrewbranch

:wave: Hi, I'm the Repro bot. I can help narrow down and track compiler bugs across releases! This comment reflects the current state of the repro in the issue body running against the nightly TypeScript.


Issue body code block by @Jym77

:x: Failed: -

  • Type 'Foo & V[P]' does not satisfy the constraint 'Foo'. Property 'foo' is missing in type 'Foo & V[P]' but required in type 'Foo'.
Historical Information
Version Reproduction Outputs
4.7.2

:x: Failed: -

  • Type 'Foo & V[P]' does not satisfy the constraint 'Foo'. Property 'foo' is missing in type 'Foo & V[P]' but required in type 'Foo'.
4.3.2, 4.4.2, 4.5.2, 4.6.2

:+1: Compiled

typescript-bot avatar Jul 07 '22 08:07 typescript-bot