Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 0752278

Browse filesBrowse files
authored
Widen reverse mapped type properties to fix them being treated as EPC-valid sources (#62722)
1 parent b33d372 commit 0752278
Copy full SHA for 0752278
Expand file treeCollapse file tree

7 files changed

+610
-1
lines changed
Open diff view settings
Collapse file

‎src/compiler/checker.ts‎

Copy file name to clipboardExpand all lines: src/compiler/checker.ts
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26438,7 +26438,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2643826438
const templateType = getTemplateTypeFromMappedType(target);
2643926439
const inference = createInferenceInfo(typeParameter);
2644026440
inferTypes([inference], sourceType, templateType);
26441-
return getTypeFromInference(inference) || unknownType;
26441+
return getWidenedType(getTypeFromInference(inference) || unknownType);
2644226442
}
2644326443

2644426444
function inferReverseMappedType(source: Type, target: MappedType, constraint: IndexType): Type | undefined {
Collapse file
+181Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.