Skip to content

Commit 3e4b06f

Browse files
committed
fixed regression related to optional class fields
1 parent 1f58d01 commit 3e4b06f

File tree

4 files changed

+490
-2
lines changed

4 files changed

+490
-2
lines changed

src/compiler/checker.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31620,10 +31620,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3162031620
const decl = lhsSymbol && lhsSymbol.valueDeclaration;
3162131621
// Unannotated, uninitialized property declarations have a type implied by their usage in the constructor or static blocks.
3162231622
// We avoid calling back into `getTypeOfExpression` and reentering contextual typing to avoid a bogus circularity error in that case when the assignment declaration is in the respective auto container
31623-
if (decl && (isPropertyDeclaration(decl) || isPropertySignature(decl)) && (!isAccessExpression(binaryExpression.left) || isThisPropertyAccessInAutoContainer(binaryExpression.left, lhsSymbol))) {
31623+
if (decl && (isPropertyDeclaration(decl) || isPropertySignature(decl))) {
3162431624
const overallAnnotation = getEffectiveTypeAnnotationNode(decl);
31625-
return (overallAnnotation && instantiateType(getTypeFromTypeNode(overallAnnotation), getSymbolLinks(lhsSymbol).mapper)) ||
31625+
const type = (overallAnnotation && instantiateType(getTypeFromTypeNode(overallAnnotation), getSymbolLinks(lhsSymbol).mapper)) ||
3162631626
(isPropertyDeclaration(decl) ? decl.initializer && getTypeOfExpression(binaryExpression.left) : undefined);
31627+
if (type || isAccessExpression(binaryExpression.left) && isThisPropertyAccessInAutoContainer(binaryExpression.left, lhsSymbol)) {
31628+
return type;
31629+
}
3162731630
}
3162831631
if (kind === AssignmentDeclarationKind.None) {
3162931632
return getTypeOfExpression(binaryExpression.left);
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
//// [tests/cases/compiler/classOptionalFieldReturnTypeInference1.ts] ////
2+
3+
=== classOptionalFieldReturnTypeInference1.ts ===
4+
declare abstract class BasePrompt {
5+
>BasePrompt : Symbol(BasePrompt, Decl(classOptionalFieldReturnTypeInference1.ts, 0, 0))
6+
7+
choice<Choice extends string, Result extends any = Choice>(
8+
>choice : Symbol(BasePrompt.choice, Decl(classOptionalFieldReturnTypeInference1.ts, 0, 35))
9+
>Choice : Symbol(Choice, Decl(classOptionalFieldReturnTypeInference1.ts, 1, 9))
10+
>Result : Symbol(Result, Decl(classOptionalFieldReturnTypeInference1.ts, 1, 31))
11+
>Choice : Symbol(Choice, Decl(classOptionalFieldReturnTypeInference1.ts, 1, 9))
12+
13+
title: string,
14+
>title : Symbol(title, Decl(classOptionalFieldReturnTypeInference1.ts, 1, 61))
15+
16+
choices: readonly Choice[],
17+
>choices : Symbol(choices, Decl(classOptionalFieldReturnTypeInference1.ts, 2, 18))
18+
>Choice : Symbol(Choice, Decl(classOptionalFieldReturnTypeInference1.ts, 1, 9))
19+
20+
): Promise<Result>;
21+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
22+
>Result : Symbol(Result, Decl(classOptionalFieldReturnTypeInference1.ts, 1, 31))
23+
}
24+
25+
type MiddlewareNode = {
26+
>MiddlewareNode : Symbol(MiddlewareNode, Decl(classOptionalFieldReturnTypeInference1.ts, 5, 1))
27+
28+
name?: string;
29+
>name : Symbol(name, Decl(classOptionalFieldReturnTypeInference1.ts, 7, 23))
30+
31+
};
32+
33+
declare class Codemods {
34+
>Codemods : Symbol(Codemods, Decl(classOptionalFieldReturnTypeInference1.ts, 9, 2))
35+
36+
registerMiddleware(
37+
>registerMiddleware : Symbol(Codemods.registerMiddleware, Decl(classOptionalFieldReturnTypeInference1.ts, 11, 24))
38+
39+
stack: "server" | "router" | "named",
40+
>stack : Symbol(stack, Decl(classOptionalFieldReturnTypeInference1.ts, 12, 21))
41+
42+
middleware: MiddlewareNode[],
43+
>middleware : Symbol(middleware, Decl(classOptionalFieldReturnTypeInference1.ts, 13, 41))
44+
>MiddlewareNode : Symbol(MiddlewareNode, Decl(classOptionalFieldReturnTypeInference1.ts, 5, 1))
45+
46+
): Promise<void>;
47+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
48+
}
49+
50+
declare class BaseCommand {
51+
>BaseCommand : Symbol(BaseCommand, Decl(classOptionalFieldReturnTypeInference1.ts, 16, 1))
52+
53+
prompt: BasePrompt;
54+
>prompt : Symbol(BaseCommand.prompt, Decl(classOptionalFieldReturnTypeInference1.ts, 18, 27))
55+
>BasePrompt : Symbol(BasePrompt, Decl(classOptionalFieldReturnTypeInference1.ts, 0, 0))
56+
57+
createCodemods(): Promise<Codemods>;
58+
>createCodemods : Symbol(BaseCommand.createCodemods, Decl(classOptionalFieldReturnTypeInference1.ts, 19, 21))
59+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
60+
>Codemods : Symbol(Codemods, Decl(classOptionalFieldReturnTypeInference1.ts, 9, 2))
61+
}
62+
63+
export default class MakeMiddleware extends BaseCommand {
64+
>MakeMiddleware : Symbol(MakeMiddleware, Decl(classOptionalFieldReturnTypeInference1.ts, 21, 1))
65+
>BaseCommand : Symbol(BaseCommand, Decl(classOptionalFieldReturnTypeInference1.ts, 16, 1))
66+
67+
declare name: string;
68+
>name : Symbol(MakeMiddleware.name, Decl(classOptionalFieldReturnTypeInference1.ts, 23, 57))
69+
70+
declare stack?: "server" | "named" | "router";
71+
>stack : Symbol(MakeMiddleware.stack, Decl(classOptionalFieldReturnTypeInference1.ts, 24, 23))
72+
73+
74+
async run() {
75+
>run : Symbol(MakeMiddleware.run, Decl(classOptionalFieldReturnTypeInference1.ts, 26, 48))
76+
77+
const stackChoices = ["server", "router", "named"];
78+
>stackChoices : Symbol(stackChoices, Decl(classOptionalFieldReturnTypeInference1.ts, 30, 9))
79+
80+
if (!this.stack) {
81+
>this.stack : Symbol(MakeMiddleware.stack, Decl(classOptionalFieldReturnTypeInference1.ts, 24, 23))
82+
>this : Symbol(MakeMiddleware, Decl(classOptionalFieldReturnTypeInference1.ts, 21, 1))
83+
>stack : Symbol(MakeMiddleware.stack, Decl(classOptionalFieldReturnTypeInference1.ts, 24, 23))
84+
85+
this.stack = await this.prompt.choice(
86+
>this.stack : Symbol(MakeMiddleware.stack, Decl(classOptionalFieldReturnTypeInference1.ts, 24, 23))
87+
>this : Symbol(MakeMiddleware, Decl(classOptionalFieldReturnTypeInference1.ts, 21, 1))
88+
>stack : Symbol(MakeMiddleware.stack, Decl(classOptionalFieldReturnTypeInference1.ts, 24, 23))
89+
>this.prompt.choice : Symbol(BasePrompt.choice, Decl(classOptionalFieldReturnTypeInference1.ts, 0, 35))
90+
>this.prompt : Symbol(BaseCommand.prompt, Decl(classOptionalFieldReturnTypeInference1.ts, 18, 27))
91+
>this : Symbol(MakeMiddleware, Decl(classOptionalFieldReturnTypeInference1.ts, 21, 1))
92+
>prompt : Symbol(BaseCommand.prompt, Decl(classOptionalFieldReturnTypeInference1.ts, 18, 27))
93+
>choice : Symbol(BasePrompt.choice, Decl(classOptionalFieldReturnTypeInference1.ts, 0, 35))
94+
95+
"Under which stack you want to register the middleware?",
96+
stackChoices,
97+
>stackChoices : Symbol(stackChoices, Decl(classOptionalFieldReturnTypeInference1.ts, 30, 9))
98+
99+
);
100+
}
101+
102+
if (!stackChoices.includes(this.stack)) {
103+
>stackChoices.includes : Symbol(Array.includes, Decl(lib.es2016.array.include.d.ts, --, --))
104+
>stackChoices : Symbol(stackChoices, Decl(classOptionalFieldReturnTypeInference1.ts, 30, 9))
105+
>includes : Symbol(Array.includes, Decl(lib.es2016.array.include.d.ts, --, --))
106+
>this.stack : Symbol(MakeMiddleware.stack, Decl(classOptionalFieldReturnTypeInference1.ts, 24, 23))
107+
>this : Symbol(MakeMiddleware, Decl(classOptionalFieldReturnTypeInference1.ts, 21, 1))
108+
>stack : Symbol(MakeMiddleware.stack, Decl(classOptionalFieldReturnTypeInference1.ts, 24, 23))
109+
110+
return;
111+
}
112+
113+
const codemods = await this.createCodemods();
114+
>codemods : Symbol(codemods, Decl(classOptionalFieldReturnTypeInference1.ts, 43, 9))
115+
>this.createCodemods : Symbol(BaseCommand.createCodemods, Decl(classOptionalFieldReturnTypeInference1.ts, 19, 21))
116+
>this : Symbol(MakeMiddleware, Decl(classOptionalFieldReturnTypeInference1.ts, 21, 1))
117+
>createCodemods : Symbol(BaseCommand.createCodemods, Decl(classOptionalFieldReturnTypeInference1.ts, 19, 21))
118+
119+
await codemods.registerMiddleware(this.stack, [
120+
>codemods.registerMiddleware : Symbol(Codemods.registerMiddleware, Decl(classOptionalFieldReturnTypeInference1.ts, 11, 24))
121+
>codemods : Symbol(codemods, Decl(classOptionalFieldReturnTypeInference1.ts, 43, 9))
122+
>registerMiddleware : Symbol(Codemods.registerMiddleware, Decl(classOptionalFieldReturnTypeInference1.ts, 11, 24))
123+
>this.stack : Symbol(MakeMiddleware.stack, Decl(classOptionalFieldReturnTypeInference1.ts, 24, 23))
124+
>this : Symbol(MakeMiddleware, Decl(classOptionalFieldReturnTypeInference1.ts, 21, 1))
125+
>stack : Symbol(MakeMiddleware.stack, Decl(classOptionalFieldReturnTypeInference1.ts, 24, 23))
126+
{
127+
name: this.name,
128+
>name : Symbol(name, Decl(classOptionalFieldReturnTypeInference1.ts, 46, 7))
129+
>this.name : Symbol(MakeMiddleware.name, Decl(classOptionalFieldReturnTypeInference1.ts, 23, 57))
130+
>this : Symbol(MakeMiddleware, Decl(classOptionalFieldReturnTypeInference1.ts, 21, 1))
131+
>name : Symbol(MakeMiddleware.name, Decl(classOptionalFieldReturnTypeInference1.ts, 23, 57))
132+
133+
},
134+
]);
135+
}
136+
}
137+
138+
declare function dom$<T extends HTMLElement>(description: string): T;
139+
>dom$ : Symbol(dom$, Decl(classOptionalFieldReturnTypeInference1.ts, 51, 1))
140+
>T : Symbol(T, Decl(classOptionalFieldReturnTypeInference1.ts, 53, 22))
141+
>HTMLElement : Symbol(HTMLElement, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
142+
>description : Symbol(description, Decl(classOptionalFieldReturnTypeInference1.ts, 53, 45))
143+
>T : Symbol(T, Decl(classOptionalFieldReturnTypeInference1.ts, 53, 22))
144+
145+
export abstract class PeekViewWidget {
146+
>PeekViewWidget : Symbol(PeekViewWidget, Decl(classOptionalFieldReturnTypeInference1.ts, 53, 69))
147+
148+
protected _titleElement?: HTMLDivElement;
149+
>_titleElement : Symbol(PeekViewWidget._titleElement, Decl(classOptionalFieldReturnTypeInference1.ts, 55, 38))
150+
>HTMLDivElement : Symbol(HTMLDivElement, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
151+
152+
protected _fillHead(container: HTMLElement, noCloseAction?: boolean): void {
153+
>_fillHead : Symbol(PeekViewWidget._fillHead, Decl(classOptionalFieldReturnTypeInference1.ts, 56, 43))
154+
>container : Symbol(container, Decl(classOptionalFieldReturnTypeInference1.ts, 58, 22))
155+
>HTMLElement : Symbol(HTMLElement, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
156+
>noCloseAction : Symbol(noCloseAction, Decl(classOptionalFieldReturnTypeInference1.ts, 58, 45))
157+
158+
this._titleElement = dom$(".peekview-title");
159+
>this._titleElement : Symbol(PeekViewWidget._titleElement, Decl(classOptionalFieldReturnTypeInference1.ts, 55, 38))
160+
>this : Symbol(PeekViewWidget, Decl(classOptionalFieldReturnTypeInference1.ts, 53, 69))
161+
>_titleElement : Symbol(PeekViewWidget._titleElement, Decl(classOptionalFieldReturnTypeInference1.ts, 55, 38))
162+
>dom$ : Symbol(dom$, Decl(classOptionalFieldReturnTypeInference1.ts, 51, 1))
163+
}
164+
}
165+

0 commit comments

Comments
 (0)