Skip to content

Commit 97a061d

Browse files
committed
Widen reverse mapped type properties to fix them being treated as EPC-valid sources
1 parent 6f4fb01 commit 97a061d

File tree

4 files changed

+486
-1
lines changed

4 files changed

+486
-1
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26421,7 +26421,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2642126421
function getTypeOfReverseMappedSymbol(symbol: ReverseMappedSymbol): Type {
2642226422
const links = getSymbolLinks(symbol);
2642326423
if (!links.type) {
26424-
links.type = inferReverseMappedType(symbol.links.propertyType, symbol.links.mappedType, symbol.links.constraintType) || unknownType;
26424+
links.type = getWidenedType(inferReverseMappedType(symbol.links.propertyType, symbol.links.mappedType, symbol.links.constraintType) || unknownType);
2642526425
}
2642626426
return links.type;
2642726427
}
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
//// [tests/cases/compiler/reverseMappedTypeInferenceWidening1.ts] ////
2+
3+
=== reverseMappedTypeInferenceWidening1.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/62720
5+
6+
type TypeFunction<ReturnType = unknown> = (...args: any[]) => ReturnType;
7+
>TypeFunction : Symbol(TypeFunction, Decl(reverseMappedTypeInferenceWidening1.ts, 0, 0))
8+
>ReturnType : Symbol(ReturnType, Decl(reverseMappedTypeInferenceWidening1.ts, 2, 18))
9+
>args : Symbol(args, Decl(reverseMappedTypeInferenceWidening1.ts, 2, 43))
10+
>ReturnType : Symbol(ReturnType, Decl(reverseMappedTypeInferenceWidening1.ts, 2, 18))
11+
12+
type Flags = {
13+
>Flags : Symbol(Flags, Decl(reverseMappedTypeInferenceWidening1.ts, 2, 73))
14+
15+
[flagName: string]: {
16+
>flagName : Symbol(flagName, Decl(reverseMappedTypeInferenceWidening1.ts, 4, 3))
17+
18+
type: TypeFunction;
19+
>type : Symbol(type, Decl(reverseMappedTypeInferenceWidening1.ts, 4, 23))
20+
>TypeFunction : Symbol(TypeFunction, Decl(reverseMappedTypeInferenceWidening1.ts, 0, 0))
21+
22+
default?: unknown;
23+
>default : Symbol(default, Decl(reverseMappedTypeInferenceWidening1.ts, 5, 23))
24+
25+
};
26+
};
27+
type TypeFlag<Schemas extends Flags> = {
28+
>TypeFlag : Symbol(TypeFlag, Decl(reverseMappedTypeInferenceWidening1.ts, 8, 2))
29+
>Schemas : Symbol(Schemas, Decl(reverseMappedTypeInferenceWidening1.ts, 9, 14))
30+
>Flags : Symbol(Flags, Decl(reverseMappedTypeInferenceWidening1.ts, 2, 73))
31+
32+
[flag in keyof Schemas]: Schemas[flag] extends { type: TypeFunction<infer T> }
33+
>flag : Symbol(flag, Decl(reverseMappedTypeInferenceWidening1.ts, 10, 3))
34+
>Schemas : Symbol(Schemas, Decl(reverseMappedTypeInferenceWidening1.ts, 9, 14))
35+
>Schemas : Symbol(Schemas, Decl(reverseMappedTypeInferenceWidening1.ts, 9, 14))
36+
>flag : Symbol(flag, Decl(reverseMappedTypeInferenceWidening1.ts, 10, 3))
37+
>type : Symbol(type, Decl(reverseMappedTypeInferenceWidening1.ts, 10, 50))
38+
>TypeFunction : Symbol(TypeFunction, Decl(reverseMappedTypeInferenceWidening1.ts, 0, 0))
39+
>T : Symbol(T, Decl(reverseMappedTypeInferenceWidening1.ts, 10, 75))
40+
41+
? T
42+
>T : Symbol(T, Decl(reverseMappedTypeInferenceWidening1.ts, 10, 75))
43+
44+
: never;
45+
};
46+
47+
declare function fn1<Options extends Flags>(
48+
>fn1 : Symbol(fn1, Decl(reverseMappedTypeInferenceWidening1.ts, 13, 2))
49+
>Options : Symbol(Options, Decl(reverseMappedTypeInferenceWidening1.ts, 15, 21))
50+
>Flags : Symbol(Flags, Decl(reverseMappedTypeInferenceWidening1.ts, 2, 73))
51+
52+
options: Options,
53+
>options : Symbol(options, Decl(reverseMappedTypeInferenceWidening1.ts, 15, 44))
54+
>Options : Symbol(Options, Decl(reverseMappedTypeInferenceWidening1.ts, 15, 21))
55+
56+
): TypeFlag<Options>;
57+
>TypeFlag : Symbol(TypeFlag, Decl(reverseMappedTypeInferenceWidening1.ts, 8, 2))
58+
>Options : Symbol(Options, Decl(reverseMappedTypeInferenceWidening1.ts, 15, 21))
59+
60+
const result1 = fn1({
61+
>result1 : Symbol(result1, Decl(reverseMappedTypeInferenceWidening1.ts, 19, 5))
62+
>fn1 : Symbol(fn1, Decl(reverseMappedTypeInferenceWidening1.ts, 13, 2))
63+
64+
booleanFlag: { type: Boolean },
65+
>booleanFlag : Symbol(booleanFlag, Decl(reverseMappedTypeInferenceWidening1.ts, 19, 21))
66+
>type : Symbol(type, Decl(reverseMappedTypeInferenceWidening1.ts, 20, 16))
67+
>Boolean : Symbol(Boolean, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
68+
69+
booleanFlagDefault: {
70+
>booleanFlagDefault : Symbol(booleanFlagDefault, Decl(reverseMappedTypeInferenceWidening1.ts, 20, 33))
71+
72+
type: Boolean,
73+
>type : Symbol(type, Decl(reverseMappedTypeInferenceWidening1.ts, 21, 23))
74+
>Boolean : Symbol(Boolean, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
75+
76+
default: false,
77+
>default : Symbol(default, Decl(reverseMappedTypeInferenceWidening1.ts, 22, 18))
78+
79+
},
80+
});
81+
result1.booleanFlag; // boolean
82+
>result1.booleanFlag : Symbol(booleanFlag, Decl(reverseMappedTypeInferenceWidening1.ts, 19, 21))
83+
>result1 : Symbol(result1, Decl(reverseMappedTypeInferenceWidening1.ts, 19, 5))
84+
>booleanFlag : Symbol(booleanFlag, Decl(reverseMappedTypeInferenceWidening1.ts, 19, 21))
85+
86+
result1.booleanFlagDefault; // boolean
87+
>result1.booleanFlagDefault : Symbol(booleanFlagDefault, Decl(reverseMappedTypeInferenceWidening1.ts, 20, 33))
88+
>result1 : Symbol(result1, Decl(reverseMappedTypeInferenceWidening1.ts, 19, 5))
89+
>booleanFlagDefault : Symbol(booleanFlagDefault, Decl(reverseMappedTypeInferenceWidening1.ts, 20, 33))
90+
91+
declare function fn2<Options extends Flags>(
92+
>fn2 : Symbol(fn2, Decl(reverseMappedTypeInferenceWidening1.ts, 27, 27))
93+
>Options : Symbol(Options, Decl(reverseMappedTypeInferenceWidening1.ts, 29, 21))
94+
>Flags : Symbol(Flags, Decl(reverseMappedTypeInferenceWidening1.ts, 2, 73))
95+
96+
options: Readonly<Options>,
97+
>options : Symbol(options, Decl(reverseMappedTypeInferenceWidening1.ts, 29, 44))
98+
>Readonly : Symbol(Readonly, Decl(lib.es5.d.ts, --, --))
99+
>Options : Symbol(Options, Decl(reverseMappedTypeInferenceWidening1.ts, 29, 21))
100+
101+
): TypeFlag<Options>;
102+
>TypeFlag : Symbol(TypeFlag, Decl(reverseMappedTypeInferenceWidening1.ts, 8, 2))
103+
>Options : Symbol(Options, Decl(reverseMappedTypeInferenceWidening1.ts, 29, 21))
104+
105+
const result2 = fn2({
106+
>result2 : Symbol(result2, Decl(reverseMappedTypeInferenceWidening1.ts, 33, 5))
107+
>fn2 : Symbol(fn2, Decl(reverseMappedTypeInferenceWidening1.ts, 27, 27))
108+
109+
booleanFlag: { type: Boolean },
110+
>booleanFlag : Symbol(booleanFlag, Decl(reverseMappedTypeInferenceWidening1.ts, 33, 21))
111+
>type : Symbol(type, Decl(reverseMappedTypeInferenceWidening1.ts, 34, 16))
112+
>Boolean : Symbol(Boolean, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
113+
114+
booleanFlagDefault: {
115+
>booleanFlagDefault : Symbol(booleanFlagDefault, Decl(reverseMappedTypeInferenceWidening1.ts, 34, 33))
116+
117+
type: Boolean,
118+
>type : Symbol(type, Decl(reverseMappedTypeInferenceWidening1.ts, 35, 23))
119+
>Boolean : Symbol(Boolean, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
120+
121+
default: false,
122+
>default : Symbol(default, Decl(reverseMappedTypeInferenceWidening1.ts, 36, 18))
123+
124+
},
125+
});
126+
result2.booleanFlag; // boolean
127+
>result2.booleanFlag : Symbol(booleanFlag, Decl(reverseMappedTypeInferenceWidening1.ts, 33, 21))
128+
>result2 : Symbol(result2, Decl(reverseMappedTypeInferenceWidening1.ts, 33, 5))
129+
>booleanFlag : Symbol(booleanFlag, Decl(reverseMappedTypeInferenceWidening1.ts, 33, 21))
130+
131+
result2.booleanFlagDefault; // boolean
132+
>result2.booleanFlagDefault : Symbol(booleanFlagDefault, Decl(reverseMappedTypeInferenceWidening1.ts, 34, 33))
133+
>result2 : Symbol(result2, Decl(reverseMappedTypeInferenceWidening1.ts, 33, 5))
134+
>booleanFlagDefault : Symbol(booleanFlagDefault, Decl(reverseMappedTypeInferenceWidening1.ts, 34, 33))
135+
136+
declare function fn3<Options extends Flags>(
137+
>fn3 : Symbol(fn3, Decl(reverseMappedTypeInferenceWidening1.ts, 41, 27))
138+
>Options : Symbol(Options, Decl(reverseMappedTypeInferenceWidening1.ts, 43, 21))
139+
>Flags : Symbol(Flags, Decl(reverseMappedTypeInferenceWidening1.ts, 2, 73))
140+
141+
options: Readonly<Options>,
142+
>options : Symbol(options, Decl(reverseMappedTypeInferenceWidening1.ts, 43, 44))
143+
>Readonly : Symbol(Readonly, Decl(lib.es5.d.ts, --, --))
144+
>Options : Symbol(Options, Decl(reverseMappedTypeInferenceWidening1.ts, 43, 21))
145+
146+
): Options;
147+
>Options : Symbol(Options, Decl(reverseMappedTypeInferenceWidening1.ts, 43, 21))
148+
149+
const result3 = fn3({
150+
>result3 : Symbol(result3, Decl(reverseMappedTypeInferenceWidening1.ts, 47, 5))
151+
>fn3 : Symbol(fn3, Decl(reverseMappedTypeInferenceWidening1.ts, 41, 27))
152+
153+
booleanFlag: { type: Boolean },
154+
>booleanFlag : Symbol(booleanFlag, Decl(reverseMappedTypeInferenceWidening1.ts, 47, 21))
155+
>type : Symbol(type, Decl(reverseMappedTypeInferenceWidening1.ts, 48, 16))
156+
>Boolean : Symbol(Boolean, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
157+
158+
booleanFlagDefault: {
159+
>booleanFlagDefault : Symbol(booleanFlagDefault, Decl(reverseMappedTypeInferenceWidening1.ts, 48, 33))
160+
161+
type: Boolean,
162+
>type : Symbol(type, Decl(reverseMappedTypeInferenceWidening1.ts, 49, 23))
163+
>Boolean : Symbol(Boolean, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
164+
165+
default: false, // no cursed EPC failure here
166+
>default : Symbol(default, Decl(reverseMappedTypeInferenceWidening1.ts, 50, 18))
167+
168+
},
169+
});
170+
171+
declare function takeType(arg: { type: unknown }): void;
172+
>takeType : Symbol(takeType, Decl(reverseMappedTypeInferenceWidening1.ts, 53, 3))
173+
>arg : Symbol(arg, Decl(reverseMappedTypeInferenceWidening1.ts, 55, 26))
174+
>type : Symbol(type, Decl(reverseMappedTypeInferenceWidening1.ts, 55, 32))
175+
176+
takeType(result3.booleanFlagDefault);
177+
>takeType : Symbol(takeType, Decl(reverseMappedTypeInferenceWidening1.ts, 53, 3))
178+
>result3.booleanFlagDefault : Symbol(booleanFlagDefault, Decl(reverseMappedTypeInferenceWidening1.ts, 48, 33))
179+
>result3 : Symbol(result3, Decl(reverseMappedTypeInferenceWidening1.ts, 47, 5))
180+
>booleanFlagDefault : Symbol(booleanFlagDefault, Decl(reverseMappedTypeInferenceWidening1.ts, 48, 33))
181+

0 commit comments

Comments
 (0)