TypeScript
TypeScript copied to clipboard
Protected field with same name in two classes messing up type constraint when narrowing array.
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.
Workaround
type Broken<V extends Array<Foo | Bar>> = {
readonly [P in keyof V]: V[P] extends (infer T extends Foo) ? Nothing<T> : never;
};
Thanks. Workaround works fine in the real code too 😄
It seems that the workaround breaks api-extractor 😢
@typescript-bot bisect good v4.6.4 bad v4.7.4
The change between v4.6.4 and v4.7.4 occurred at 787bb9ddb60368f84b1ed1b0971aa2bf79fdec77.
Hey this is the second bisect today that blames #48837 😅
: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: -
|
| 4.3.2, 4.4.2, 4.5.2, 4.6.2 |
:+1: Compiled |