Skip to content

Commit 5b10466

Browse files
authored
Prevent ObjectFlags.IdenticalBaseTypeExists and ObjectFlags.IsConstrainedTypeVariable confusion (#56711)
1 parent 7694530 commit 5b10466

File tree

4 files changed

+559
-3
lines changed

4 files changed

+559
-3
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17006,7 +17006,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1700617006
const typeVariables: TypeVariable[] = [];
1700717007
// First collect a list of the type variables occurring in constraining intersections.
1700817008
for (const type of types) {
17009-
if (getObjectFlags(type) & ObjectFlags.IsConstrainedTypeVariable) {
17009+
if (type.flags & TypeFlags.Intersection && getObjectFlags(type) & ObjectFlags.IsConstrainedTypeVariable) {
1701017010
const index = (type as IntersectionType).types[0].flags & TypeFlags.TypeVariable ? 0 : 1;
1701117011
pushIfUnique(typeVariables, (type as IntersectionType).types[index]);
1701217012
}
@@ -17018,7 +17018,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1701817018
const primitives: Type[] = [];
1701917019
// First collect the primitive types from the constraining intersections.
1702017020
for (const type of types) {
17021-
if (getObjectFlags(type) & ObjectFlags.IsConstrainedTypeVariable) {
17021+
if (type.flags & TypeFlags.Intersection && getObjectFlags(type) & ObjectFlags.IsConstrainedTypeVariable) {
1702217022
const index = (type as IntersectionType).types[0].flags & TypeFlags.TypeVariable ? 0 : 1;
1702317023
if ((type as IntersectionType).types[index] === typeVariable) {
1702417024
insertType(primitives, (type as IntersectionType).types[1 - index]);
@@ -17033,7 +17033,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1703317033
while (i > 0) {
1703417034
i--;
1703517035
const type = types[i];
17036-
if (getObjectFlags(type) & ObjectFlags.IsConstrainedTypeVariable) {
17036+
if (type.flags & TypeFlags.Intersection && getObjectFlags(type) & ObjectFlags.IsConstrainedTypeVariable) {
1703717037
const index = (type as IntersectionType).types[0].flags & TypeFlags.TypeVariable ? 0 : 1;
1703817038
if ((type as IntersectionType).types[index] === typeVariable && containsType(primitives, (type as IntersectionType).types[1 - index])) {
1703917039
orderedRemoveItemAt(types, i);
Lines changed: 275 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,275 @@
1+
//// [tests/cases/compiler/unionReductionWithStringMappingAndIdenticalBaseTypeExistsNoCrash.tsx] ////
2+
3+
=== node_modules/@types/react/index.d.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/56688
5+
6+
7+
export = React;
8+
>React : Symbol(React, Decl(index.d.ts, 4, 26))
9+
10+
export as namespace React;
11+
>React : Symbol(React, Decl(index.d.ts, 3, 15))
12+
13+
declare namespace React {
14+
>React : Symbol(React, Decl(index.d.ts, 4, 26))
15+
16+
type ReactNode =
17+
>ReactNode : Symbol(ReactNode, Decl(index.d.ts, 6, 25))
18+
19+
| ReactElement
20+
>ReactElement : Symbol(ReactElement, Decl(index.d.ts, 15, 58))
21+
22+
| string
23+
| number
24+
| Iterable<ReactNode>
25+
>Iterable : Symbol(Iterable, Decl(lib.es2015.iterable.d.ts, --, --))
26+
>ReactNode : Symbol(ReactNode, Decl(index.d.ts, 6, 25))
27+
28+
| boolean
29+
| null
30+
| undefined;
31+
type JSXElementConstructor<P> = (props: P) => ReactNode;
32+
>JSXElementConstructor : Symbol(JSXElementConstructor, Decl(index.d.ts, 14, 16))
33+
>P : Symbol(P, Decl(index.d.ts, 15, 29))
34+
>props : Symbol(props, Decl(index.d.ts, 15, 35))
35+
>P : Symbol(P, Decl(index.d.ts, 15, 29))
36+
>ReactNode : Symbol(ReactNode, Decl(index.d.ts, 6, 25))
37+
38+
interface ReactElement<
39+
>ReactElement : Symbol(ReactElement, Decl(index.d.ts, 15, 58))
40+
41+
P = any,
42+
>P : Symbol(P, Decl(index.d.ts, 16, 25))
43+
44+
T extends string | JSXElementConstructor<any> =
45+
>T : Symbol(T, Decl(index.d.ts, 17, 12))
46+
>JSXElementConstructor : Symbol(JSXElementConstructor, Decl(index.d.ts, 14, 16))
47+
48+
| string
49+
| JSXElementConstructor<any>,
50+
>JSXElementConstructor : Symbol(JSXElementConstructor, Decl(index.d.ts, 14, 16))
51+
52+
> {
53+
type: T;
54+
>type : Symbol(ReactElement.type, Decl(index.d.ts, 21, 5))
55+
>T : Symbol(T, Decl(index.d.ts, 17, 12))
56+
57+
props: P;
58+
>props : Symbol(ReactElement.props, Decl(index.d.ts, 22, 12))
59+
>P : Symbol(P, Decl(index.d.ts, 16, 25))
60+
61+
key: string | null;
62+
>key : Symbol(ReactElement.key, Decl(index.d.ts, 23, 13))
63+
}
64+
65+
type ComponentProps<T extends JSXElementConstructor<any>> =
66+
>ComponentProps : Symbol(ComponentProps, Decl(index.d.ts, 25, 3))
67+
>T : Symbol(T, Decl(index.d.ts, 27, 22))
68+
>JSXElementConstructor : Symbol(JSXElementConstructor, Decl(index.d.ts, 14, 16))
69+
70+
T extends JSXElementConstructor<infer P> ? P : never;
71+
>T : Symbol(T, Decl(index.d.ts, 27, 22))
72+
>JSXElementConstructor : Symbol(JSXElementConstructor, Decl(index.d.ts, 14, 16))
73+
>P : Symbol(P, Decl(index.d.ts, 28, 41))
74+
>P : Symbol(P, Decl(index.d.ts, 28, 41))
75+
76+
interface ExoticComponent<P = {}> {
77+
>ExoticComponent : Symbol(ExoticComponent, Decl(index.d.ts, 28, 57))
78+
>P : Symbol(P, Decl(index.d.ts, 30, 28))
79+
80+
(props: P): ReactNode;
81+
>props : Symbol(props, Decl(index.d.ts, 31, 5))
82+
>P : Symbol(P, Decl(index.d.ts, 30, 28))
83+
>ReactNode : Symbol(ReactNode, Decl(index.d.ts, 6, 25))
84+
85+
readonly $$typeof: symbol;
86+
>$$typeof : Symbol(ExoticComponent.$$typeof, Decl(index.d.ts, 31, 26))
87+
}
88+
89+
type LazyExoticComponent<T extends JSXElementConstructor<any>> =
90+
>LazyExoticComponent : Symbol(LazyExoticComponent, Decl(index.d.ts, 33, 3))
91+
>T : Symbol(T, Decl(index.d.ts, 35, 27))
92+
>JSXElementConstructor : Symbol(JSXElementConstructor, Decl(index.d.ts, 14, 16))
93+
94+
ExoticComponent<ComponentProps<T>> & {
95+
>ExoticComponent : Symbol(ExoticComponent, Decl(index.d.ts, 28, 57))
96+
>ComponentProps : Symbol(ComponentProps, Decl(index.d.ts, 25, 3))
97+
>T : Symbol(T, Decl(index.d.ts, 35, 27))
98+
99+
readonly _result: T;
100+
>_result : Symbol(_result, Decl(index.d.ts, 36, 42))
101+
>T : Symbol(T, Decl(index.d.ts, 35, 27))
102+
103+
};
104+
105+
function createElement(): void;
106+
>createElement : Symbol(createElement, Decl(index.d.ts, 38, 6))
107+
108+
namespace JSX {
109+
>JSX : Symbol(JSX, Decl(index.d.ts, 40, 33))
110+
111+
interface Element extends GlobalJSXElement {}
112+
>Element : Symbol(Element, Decl(index.d.ts, 42, 17))
113+
>GlobalJSXElement : Symbol(GlobalJSXElement, Decl(index.d.ts, 74, 1))
114+
115+
interface ElementChildrenAttribute
116+
>ElementChildrenAttribute : Symbol(ElementChildrenAttribute, Decl(index.d.ts, 43, 49))
117+
118+
extends GlobalJSXElementChildrenAttribute {}
119+
>GlobalJSXElementChildrenAttribute : Symbol(GlobalJSXElementChildrenAttribute, Decl(index.d.ts, 76, 49))
120+
121+
type LibraryManagedAttributes<C, P> = GlobalJSXLibraryManagedAttributes<
122+
>LibraryManagedAttributes : Symbol(LibraryManagedAttributes, Decl(index.d.ts, 45, 50))
123+
>C : Symbol(C, Decl(index.d.ts, 46, 34))
124+
>P : Symbol(P, Decl(index.d.ts, 46, 36))
125+
>GlobalJSXLibraryManagedAttributes : Symbol(GlobalJSXLibraryManagedAttributes, Decl(index.d.ts, 78, 41))
126+
127+
C,
128+
>C : Symbol(C, Decl(index.d.ts, 46, 34))
129+
130+
P
131+
>P : Symbol(P, Decl(index.d.ts, 46, 36))
132+
133+
>;
134+
interface IntrinsicElements extends GlobalJSXIntrinsicElements {}
135+
>IntrinsicElements : Symbol(IntrinsicElements, Decl(index.d.ts, 49, 6))
136+
>GlobalJSXIntrinsicElements : Symbol(GlobalJSXIntrinsicElements, Decl(index.d.ts, 82, 2))
137+
}
138+
}
139+
140+
type ReactManagedAttributes<C, P> = C extends { defaultProps: infer D }
141+
>ReactManagedAttributes : Symbol(ReactManagedAttributes, Decl(index.d.ts, 52, 1))
142+
>C : Symbol(C, Decl(index.d.ts, 54, 28))
143+
>P : Symbol(P, Decl(index.d.ts, 54, 30))
144+
>C : Symbol(C, Decl(index.d.ts, 54, 28))
145+
>defaultProps : Symbol(defaultProps, Decl(index.d.ts, 54, 47))
146+
>D : Symbol(D, Decl(index.d.ts, 54, 67))
147+
148+
? P & D
149+
>P : Symbol(P, Decl(index.d.ts, 54, 30))
150+
>D : Symbol(D, Decl(index.d.ts, 54, 67))
151+
152+
: P;
153+
>P : Symbol(P, Decl(index.d.ts, 54, 30))
154+
155+
declare global {
156+
>global : Symbol(global, Decl(index.d.ts, 56, 6))
157+
158+
namespace JSX {
159+
>JSX : Symbol(JSX, Decl(index.d.ts, 58, 16))
160+
161+
interface Element extends React.ReactElement<any, any> {}
162+
>Element : Symbol(Element, Decl(index.d.ts, 59, 17))
163+
>React.ReactElement : Symbol(React.ReactElement, Decl(index.d.ts, 15, 58))
164+
>React : Symbol(React, Decl(index.d.ts, 4, 26))
165+
>ReactElement : Symbol(React.ReactElement, Decl(index.d.ts, 15, 58))
166+
167+
interface ElementChildrenAttribute {
168+
>ElementChildrenAttribute : Symbol(ElementChildrenAttribute, Decl(index.d.ts, 60, 61))
169+
170+
children: {};
171+
>children : Symbol(ElementChildrenAttribute.children, Decl(index.d.ts, 61, 40))
172+
}
173+
type LibraryManagedAttributes<C, P> = C extends React.LazyExoticComponent<
174+
>LibraryManagedAttributes : Symbol(LibraryManagedAttributes, Decl(index.d.ts, 63, 5))
175+
>C : Symbol(C, Decl(index.d.ts, 64, 34))
176+
>P : Symbol(P, Decl(index.d.ts, 64, 36))
177+
>C : Symbol(C, Decl(index.d.ts, 64, 34))
178+
>React : Symbol(React, Decl(index.d.ts, 4, 26))
179+
>LazyExoticComponent : Symbol(React.LazyExoticComponent, Decl(index.d.ts, 33, 3))
180+
181+
infer T
182+
>T : Symbol(T, Decl(index.d.ts, 65, 11))
183+
184+
>
185+
? ReactManagedAttributes<T, P>
186+
>ReactManagedAttributes : Symbol(ReactManagedAttributes, Decl(index.d.ts, 52, 1))
187+
>T : Symbol(T, Decl(index.d.ts, 65, 11))
188+
>P : Symbol(P, Decl(index.d.ts, 64, 36))
189+
190+
: ReactManagedAttributes<C, P>;
191+
>ReactManagedAttributes : Symbol(ReactManagedAttributes, Decl(index.d.ts, 52, 1))
192+
>C : Symbol(C, Decl(index.d.ts, 64, 34))
193+
>P : Symbol(P, Decl(index.d.ts, 64, 36))
194+
195+
interface IntrinsicElements {
196+
>IntrinsicElements : Symbol(IntrinsicElements, Decl(index.d.ts, 68, 37))
197+
198+
div: {};
199+
>div : Symbol(IntrinsicElements.div, Decl(index.d.ts, 69, 33))
200+
201+
span: {};
202+
>span : Symbol(IntrinsicElements.span, Decl(index.d.ts, 70, 14))
203+
}
204+
}
205+
}
206+
207+
interface GlobalJSXElement extends JSX.Element {}
208+
>GlobalJSXElement : Symbol(GlobalJSXElement, Decl(index.d.ts, 74, 1))
209+
>JSX.Element : Symbol(JSX.Element, Decl(index.d.ts, 59, 17))
210+
>JSX : Symbol(JSX, Decl(index.d.ts, 58, 16))
211+
>Element : Symbol(JSX.Element, Decl(index.d.ts, 59, 17))
212+
213+
interface GlobalJSXElementChildrenAttribute
214+
>GlobalJSXElementChildrenAttribute : Symbol(GlobalJSXElementChildrenAttribute, Decl(index.d.ts, 76, 49))
215+
216+
extends JSX.ElementChildrenAttribute {}
217+
>JSX.ElementChildrenAttribute : Symbol(JSX.ElementChildrenAttribute, Decl(index.d.ts, 60, 61))
218+
>JSX : Symbol(JSX, Decl(index.d.ts, 58, 16))
219+
>ElementChildrenAttribute : Symbol(JSX.ElementChildrenAttribute, Decl(index.d.ts, 60, 61))
220+
221+
type GlobalJSXLibraryManagedAttributes<C, P> = JSX.LibraryManagedAttributes<
222+
>GlobalJSXLibraryManagedAttributes : Symbol(GlobalJSXLibraryManagedAttributes, Decl(index.d.ts, 78, 41))
223+
>C : Symbol(C, Decl(index.d.ts, 79, 39))
224+
>P : Symbol(P, Decl(index.d.ts, 79, 41))
225+
>JSX : Symbol(JSX, Decl(index.d.ts, 58, 16))
226+
>LibraryManagedAttributes : Symbol(JSX.LibraryManagedAttributes, Decl(index.d.ts, 63, 5))
227+
228+
C,
229+
>C : Symbol(C, Decl(index.d.ts, 79, 39))
230+
231+
P
232+
>P : Symbol(P, Decl(index.d.ts, 79, 41))
233+
234+
>;
235+
interface GlobalJSXIntrinsicElements extends JSX.IntrinsicElements {}
236+
>GlobalJSXIntrinsicElements : Symbol(GlobalJSXIntrinsicElements, Decl(index.d.ts, 82, 2))
237+
>JSX.IntrinsicElements : Symbol(JSX.IntrinsicElements, Decl(index.d.ts, 68, 37))
238+
>JSX : Symbol(JSX, Decl(index.d.ts, 58, 16))
239+
>IntrinsicElements : Symbol(JSX.IntrinsicElements, Decl(index.d.ts, 68, 37))
240+
241+
=== src/index.tsx ===
242+
import React from 'react'
243+
>React : Symbol(React, Decl(index.tsx, 0, 6))
244+
245+
declare function upperFirst<T extends string>(str: T): Capitalize<T>
246+
>upperFirst : Symbol(upperFirst, Decl(index.tsx, 0, 25))
247+
>T : Symbol(T, Decl(index.tsx, 2, 28))
248+
>str : Symbol(str, Decl(index.tsx, 2, 46))
249+
>T : Symbol(T, Decl(index.tsx, 2, 28))
250+
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
251+
>T : Symbol(T, Decl(index.tsx, 2, 28))
252+
253+
const displayEnum = (value: string) => upperFirst(value.toLowerCase())
254+
>displayEnum : Symbol(displayEnum, Decl(index.tsx, 4, 5))
255+
>value : Symbol(value, Decl(index.tsx, 4, 21))
256+
>upperFirst : Symbol(upperFirst, Decl(index.tsx, 0, 25))
257+
>value.toLowerCase : Symbol(String.toLowerCase, Decl(lib.es5.d.ts, --, --))
258+
>value : Symbol(value, Decl(index.tsx, 4, 21))
259+
>toLowerCase : Symbol(String.toLowerCase, Decl(lib.es5.d.ts, --, --))
260+
261+
function Comp() {
262+
>Comp : Symbol(Comp, Decl(index.tsx, 4, 70))
263+
264+
return <div>
265+
>div : Symbol(JSX.IntrinsicElements.div, Decl(index.d.ts, 69, 33))
266+
267+
<span>Scope:</span> {displayEnum("VALUE")}
268+
>span : Symbol(JSX.IntrinsicElements.span, Decl(index.d.ts, 70, 14))
269+
>span : Symbol(JSX.IntrinsicElements.span, Decl(index.d.ts, 70, 14))
270+
>displayEnum : Symbol(displayEnum, Decl(index.tsx, 4, 5))
271+
272+
</div>
273+
>div : Symbol(JSX.IntrinsicElements.div, Decl(index.d.ts, 69, 33))
274+
}
275+

0 commit comments

Comments
 (0)