Skip to content

Commit 529fc9e

Browse files
committed
Don't obtain apparent type of contextual types being optional type variables
1 parent 11e7932 commit 529fc9e

File tree

4 files changed

+205
-1
lines changed

4 files changed

+205
-1
lines changed

src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -32412,7 +32412,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3241232412
getContextualTypeForObjectLiteralMethod(node, contextFlags) :
3241332413
getContextualType(node, contextFlags);
3241432414
const instantiatedType = instantiateContextualType(contextualType, node, contextFlags);
32415-
if (instantiatedType && !(contextFlags && contextFlags & ContextFlags.NoConstraints && instantiatedType.flags & TypeFlags.TypeVariable)) {
32415+
if (instantiatedType && !(contextFlags && contextFlags & ContextFlags.NoConstraints && maybeTypeOfKind(getNonNullableType(instantiatedType), TypeFlags.TypeVariable))) {
3241632416
const apparentType = mapType(
3241732417
instantiatedType,
3241832418
// When obtaining apparent type of *contextual* type we don't want to get apparent type of mapped types.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
//// [tests/cases/compiler/inferenceFromGenericClass1.ts] ////
2+
3+
=== inferenceFromGenericClass1.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/61633
5+
6+
type AnyConstructor = new (...args: any[]) => object;
7+
>AnyConstructor : Symbol(AnyConstructor, Decl(inferenceFromGenericClass1.ts, 0, 0))
8+
>args : Symbol(args, Decl(inferenceFromGenericClass1.ts, 2, 27))
9+
10+
class Container<T> {}
11+
>Container : Symbol(Container, Decl(inferenceFromGenericClass1.ts, 2, 53))
12+
>T : Symbol(T, Decl(inferenceFromGenericClass1.ts, 4, 16))
13+
14+
declare function RenderFlagsMixin1<
15+
>RenderFlagsMixin1 : Symbol(RenderFlagsMixin1, Decl(inferenceFromGenericClass1.ts, 4, 21))
16+
17+
BaseClass extends AnyConstructor | undefined = undefined,
18+
>BaseClass : Symbol(BaseClass, Decl(inferenceFromGenericClass1.ts, 6, 35))
19+
>AnyConstructor : Symbol(AnyConstructor, Decl(inferenceFromGenericClass1.ts, 0, 0))
20+
21+
>(Base?: BaseClass): BaseClass;
22+
>Base : Symbol(Base, Decl(inferenceFromGenericClass1.ts, 8, 2))
23+
>BaseClass : Symbol(BaseClass, Decl(inferenceFromGenericClass1.ts, 6, 35))
24+
>BaseClass : Symbol(BaseClass, Decl(inferenceFromGenericClass1.ts, 6, 35))
25+
26+
const result1 = RenderFlagsMixin1(Container);
27+
>result1 : Symbol(result1, Decl(inferenceFromGenericClass1.ts, 10, 5))
28+
>RenderFlagsMixin1 : Symbol(RenderFlagsMixin1, Decl(inferenceFromGenericClass1.ts, 4, 21))
29+
>Container : Symbol(Container, Decl(inferenceFromGenericClass1.ts, 2, 53))
30+
31+
declare function RenderFlagsMixin2<
32+
>RenderFlagsMixin2 : Symbol(RenderFlagsMixin2, Decl(inferenceFromGenericClass1.ts, 10, 45))
33+
34+
BaseClass extends AnyConstructor | undefined = undefined,
35+
>BaseClass : Symbol(BaseClass, Decl(inferenceFromGenericClass1.ts, 12, 35))
36+
>AnyConstructor : Symbol(AnyConstructor, Decl(inferenceFromGenericClass1.ts, 0, 0))
37+
38+
>(Base: BaseClass): BaseClass;
39+
>Base : Symbol(Base, Decl(inferenceFromGenericClass1.ts, 14, 2))
40+
>BaseClass : Symbol(BaseClass, Decl(inferenceFromGenericClass1.ts, 12, 35))
41+
>BaseClass : Symbol(BaseClass, Decl(inferenceFromGenericClass1.ts, 12, 35))
42+
43+
const result2 = RenderFlagsMixin2(Container);
44+
>result2 : Symbol(result2, Decl(inferenceFromGenericClass1.ts, 16, 5))
45+
>RenderFlagsMixin2 : Symbol(RenderFlagsMixin2, Decl(inferenceFromGenericClass1.ts, 10, 45))
46+
>Container : Symbol(Container, Decl(inferenceFromGenericClass1.ts, 2, 53))
47+
48+
declare function RenderFlagsMixin3<
49+
>RenderFlagsMixin3 : Symbol(RenderFlagsMixin3, Decl(inferenceFromGenericClass1.ts, 16, 45))
50+
51+
BaseClass extends AnyConstructor | undefined = undefined,
52+
>BaseClass : Symbol(BaseClass, Decl(inferenceFromGenericClass1.ts, 18, 35))
53+
>AnyConstructor : Symbol(AnyConstructor, Decl(inferenceFromGenericClass1.ts, 0, 0))
54+
55+
>(Base: BaseClass | number): BaseClass;
56+
>Base : Symbol(Base, Decl(inferenceFromGenericClass1.ts, 20, 2))
57+
>BaseClass : Symbol(BaseClass, Decl(inferenceFromGenericClass1.ts, 18, 35))
58+
>BaseClass : Symbol(BaseClass, Decl(inferenceFromGenericClass1.ts, 18, 35))
59+
60+
const result3 = RenderFlagsMixin3(Container);
61+
>result3 : Symbol(result3, Decl(inferenceFromGenericClass1.ts, 22, 5))
62+
>RenderFlagsMixin3 : Symbol(RenderFlagsMixin3, Decl(inferenceFromGenericClass1.ts, 16, 45))
63+
>Container : Symbol(Container, Decl(inferenceFromGenericClass1.ts, 2, 53))
64+
65+
declare function RenderFlagsMixin4<
66+
>RenderFlagsMixin4 : Symbol(RenderFlagsMixin4, Decl(inferenceFromGenericClass1.ts, 22, 45))
67+
68+
BaseClass extends AnyConstructor | undefined = undefined,
69+
>BaseClass : Symbol(BaseClass, Decl(inferenceFromGenericClass1.ts, 24, 35))
70+
>AnyConstructor : Symbol(AnyConstructor, Decl(inferenceFromGenericClass1.ts, 0, 0))
71+
72+
>(Base?: BaseClass | number): BaseClass;
73+
>Base : Symbol(Base, Decl(inferenceFromGenericClass1.ts, 26, 2))
74+
>BaseClass : Symbol(BaseClass, Decl(inferenceFromGenericClass1.ts, 24, 35))
75+
>BaseClass : Symbol(BaseClass, Decl(inferenceFromGenericClass1.ts, 24, 35))
76+
77+
const result4 = RenderFlagsMixin4(Container);
78+
>result4 : Symbol(result4, Decl(inferenceFromGenericClass1.ts, 28, 5))
79+
>RenderFlagsMixin4 : Symbol(RenderFlagsMixin4, Decl(inferenceFromGenericClass1.ts, 22, 45))
80+
>Container : Symbol(Container, Decl(inferenceFromGenericClass1.ts, 2, 53))
81+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
//// [tests/cases/compiler/inferenceFromGenericClass1.ts] ////
2+
3+
=== inferenceFromGenericClass1.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/61633
5+
6+
type AnyConstructor = new (...args: any[]) => object;
7+
>AnyConstructor : AnyConstructor
8+
> : ^^^^^^^^^^^^^^
9+
>args : any[]
10+
> : ^^^^^
11+
12+
class Container<T> {}
13+
>Container : Container<T>
14+
> : ^^^^^^^^^^^^
15+
16+
declare function RenderFlagsMixin1<
17+
>RenderFlagsMixin1 : <BaseClass extends AnyConstructor | undefined = undefined>(Base?: BaseClass) => BaseClass
18+
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^ ^^^^^
19+
20+
BaseClass extends AnyConstructor | undefined = undefined,
21+
>(Base?: BaseClass): BaseClass;
22+
>Base : BaseClass | undefined
23+
> : ^^^^^^^^^^^^^^^^^^^^^
24+
25+
const result1 = RenderFlagsMixin1(Container);
26+
>result1 : typeof Container
27+
> : ^^^^^^^^^^^^^^^^
28+
>RenderFlagsMixin1(Container) : typeof Container
29+
> : ^^^^^^^^^^^^^^^^
30+
>RenderFlagsMixin1 : <BaseClass extends AnyConstructor | undefined = undefined>(Base?: BaseClass) => BaseClass
31+
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^ ^^^^^
32+
>Container : typeof Container
33+
> : ^^^^^^^^^^^^^^^^
34+
35+
declare function RenderFlagsMixin2<
36+
>RenderFlagsMixin2 : <BaseClass extends AnyConstructor | undefined = undefined>(Base: BaseClass) => BaseClass
37+
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^^^ ^^ ^^^^^
38+
39+
BaseClass extends AnyConstructor | undefined = undefined,
40+
>(Base: BaseClass): BaseClass;
41+
>Base : BaseClass
42+
> : ^^^^^^^^^
43+
44+
const result2 = RenderFlagsMixin2(Container);
45+
>result2 : typeof Container
46+
> : ^^^^^^^^^^^^^^^^
47+
>RenderFlagsMixin2(Container) : typeof Container
48+
> : ^^^^^^^^^^^^^^^^
49+
>RenderFlagsMixin2 : <BaseClass extends AnyConstructor | undefined = undefined>(Base: BaseClass) => BaseClass
50+
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^^^ ^^ ^^^^^
51+
>Container : typeof Container
52+
> : ^^^^^^^^^^^^^^^^
53+
54+
declare function RenderFlagsMixin3<
55+
>RenderFlagsMixin3 : <BaseClass extends AnyConstructor | undefined = undefined>(Base: BaseClass | number) => BaseClass
56+
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^^^ ^^ ^^^^^
57+
58+
BaseClass extends AnyConstructor | undefined = undefined,
59+
>(Base: BaseClass | number): BaseClass;
60+
>Base : number | BaseClass
61+
> : ^^^^^^^^^^^^^^^^^^
62+
63+
const result3 = RenderFlagsMixin3(Container);
64+
>result3 : typeof Container
65+
> : ^^^^^^^^^^^^^^^^
66+
>RenderFlagsMixin3(Container) : typeof Container
67+
> : ^^^^^^^^^^^^^^^^
68+
>RenderFlagsMixin3 : <BaseClass extends AnyConstructor | undefined = undefined>(Base: BaseClass | number) => BaseClass
69+
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^^^ ^^ ^^^^^
70+
>Container : typeof Container
71+
> : ^^^^^^^^^^^^^^^^
72+
73+
declare function RenderFlagsMixin4<
74+
>RenderFlagsMixin4 : <BaseClass extends AnyConstructor | undefined = undefined>(Base?: BaseClass | number) => BaseClass
75+
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^ ^^^^^
76+
77+
BaseClass extends AnyConstructor | undefined = undefined,
78+
>(Base?: BaseClass | number): BaseClass;
79+
>Base : number | BaseClass | undefined
80+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
81+
82+
const result4 = RenderFlagsMixin4(Container);
83+
>result4 : typeof Container
84+
> : ^^^^^^^^^^^^^^^^
85+
>RenderFlagsMixin4(Container) : typeof Container
86+
> : ^^^^^^^^^^^^^^^^
87+
>RenderFlagsMixin4 : <BaseClass extends AnyConstructor | undefined = undefined>(Base?: BaseClass | number) => BaseClass
88+
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^ ^^^^^
89+
>Container : typeof Container
90+
> : ^^^^^^^^^^^^^^^^
91+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// @strict: true
2+
// @noEmit: true
3+
4+
// https://github.com/microsoft/TypeScript/issues/61633
5+
6+
type AnyConstructor = new (...args: any[]) => object;
7+
8+
class Container<T> {}
9+
10+
declare function RenderFlagsMixin1<
11+
BaseClass extends AnyConstructor | undefined = undefined,
12+
>(Base?: BaseClass): BaseClass;
13+
14+
const result1 = RenderFlagsMixin1(Container);
15+
16+
declare function RenderFlagsMixin2<
17+
BaseClass extends AnyConstructor | undefined = undefined,
18+
>(Base: BaseClass): BaseClass;
19+
20+
const result2 = RenderFlagsMixin2(Container);
21+
22+
declare function RenderFlagsMixin3<
23+
BaseClass extends AnyConstructor | undefined = undefined,
24+
>(Base: BaseClass | number): BaseClass;
25+
26+
const result3 = RenderFlagsMixin3(Container);
27+
28+
declare function RenderFlagsMixin4<
29+
BaseClass extends AnyConstructor | undefined = undefined,
30+
>(Base?: BaseClass | number): BaseClass;
31+
32+
const result4 = RenderFlagsMixin4(Container);

0 commit comments

Comments
 (0)