We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
1 parent 9fbcdb1 commit f84b2d2Copy full SHA for f84b2d2
src/compiler/checker.ts
@@ -23234,10 +23234,6 @@ namespace ts {
23234
const assignmentKind = getAssignmentTargetKind(node);
23235
const apparentType = getApparentType(assignmentKind !== AssignmentKind.None || isMethodAccessForCall(node) ? getWidenedType(leftType) : leftType);
23236
if (isPrivateIdentifier(right)) {
23237
- if (isOptionalChain(node)) {
23238
- grammarErrorOnNode(right, Diagnostics.An_optional_chain_cannot_contain_private_identifiers);
23239
- return anyType;
23240
- }
23241
checkExternalEmitHelpers(node, ExternalEmitHelpers.ClassPrivateFieldGet);
23242
}
23243
const isAnyLike = isTypeAny(apparentType) || apparentType === silentNeverType;
src/compiler/parser.ts
@@ -4680,10 +4680,12 @@ namespace ts {
4680
const propertyAccess = <PropertyAccessExpression>createNode(SyntaxKind.PropertyAccessExpression, expression.pos);
4681
propertyAccess.expression = expression;
4682
propertyAccess.questionDotToken = questionDotToken;
4683
- // checker will error on private identifiers in optional chains, so don't have to catch them here
4684
propertyAccess.name = parseRightSideOfDot(/*allowIdentifierNames*/ true, /*allowPrivateIdentifiers*/ true);
4685
if (questionDotToken || expression.flags & NodeFlags.OptionalChain) {
4686
propertyAccess.flags |= NodeFlags.OptionalChain;
+ if (isPrivateIdentifier(propertyAccess.name)) {
4687
+ parseErrorAtRange(propertyAccess.name, Diagnostics.An_optional_chain_cannot_contain_private_identifiers);
4688
+ }
4689
4690
return finishNode(propertyAccess);
4691
tests/baselines/reference/privateIdentifierChain.1.symbols
@@ -19,14 +19,17 @@ class A {
19
20
constructor() {
21
this?.#b; // Error
22
+>this?.#b : Symbol(A.#b, Decl(privateIdentifierChain.1.ts, 1, 9))
23
>this : Symbol(A, Decl(privateIdentifierChain.1.ts, 0, 0))
24
25
this?.a.#b; // Error
26
+>this?.a.#b : Symbol(A.#b, Decl(privateIdentifierChain.1.ts, 1, 9))
27
>this?.a : Symbol(A.a, Decl(privateIdentifierChain.1.ts, 0, 9))
28
29
>a : Symbol(A.a, Decl(privateIdentifierChain.1.ts, 0, 9))
30
31
this?.getA().#b; // Error
32
+>this?.getA().#b : Symbol(A.#b, Decl(privateIdentifierChain.1.ts, 1, 9))
33
>this?.getA : Symbol(A.getA, Decl(privateIdentifierChain.1.ts, 2, 11))
34
35
>getA : Symbol(A.getA, Decl(privateIdentifierChain.1.ts, 2, 11))
tests/baselines/reference/privateIdentifierChain.1.types
@@ -17,17 +17,17 @@ class A {
17
18
->this?.#b : any
+>this?.#b : A | undefined
>this : this
->this?.a.#b : any
+>this?.a.#b : A | undefined
>this?.a : A | undefined
>a : A | undefined
->this?.getA().#b : any
+>this?.getA().#b : A | undefined
>this?.getA() : A | undefined
>this?.getA : (() => A) | undefined
tests/baselines/reference/privateNameUncheckedJsOptionalChain.errors.txt
@@ -0,0 +1,17 @@
1
+tests/cases/conformance/classes/members/privateNames/privateNameUncheckedJsOptionalChain.js(4,15): error TS18030: An optional chain cannot contain private identifiers.
2
+tests/cases/conformance/classes/members/privateNames/privateNameUncheckedJsOptionalChain.js(5,15): error TS18030: An optional chain cannot contain private identifiers.
3
+
4
5
+==== tests/cases/conformance/classes/members/privateNames/privateNameUncheckedJsOptionalChain.js (2 errors) ====
6
+ class C {
7
+ #bar;
8
+ constructor () {
9
+ this?.#foo;
10
+ ~~~~
11
+!!! error TS18030: An optional chain cannot contain private identifiers.
12
+ this?.#bar;
13
14
15
16
tests/baselines/reference/privateNameUncheckedJsOptionalChain.symbols
+=== tests/cases/conformance/classes/members/privateNames/privateNameUncheckedJsOptionalChain.js ===
+class C {
+>C : Symbol(C, Decl(privateNameUncheckedJsOptionalChain.js, 0, 0))
+>#bar : Symbol(C.#bar, Decl(privateNameUncheckedJsOptionalChain.js, 0, 9))
+>this : Symbol(C, Decl(privateNameUncheckedJsOptionalChain.js, 0, 0))
+>this?.#bar : Symbol(C.#bar, Decl(privateNameUncheckedJsOptionalChain.js, 0, 9))
+}
tests/baselines/reference/privateNameUncheckedJsOptionalChain.types
@@ -0,0 +1,18 @@
+>C : C
+>#bar : any
+>this?.#foo : any
+>this : this
+>this?.#bar : any
tests/cases/conformance/classes/members/privateNames/privateNameUncheckedJsOptionalChain.ts
@@ -0,0 +1,13 @@
+// @allowJs: true
+// @checkJs: false
+// @noEmit: true
+// @Filename: privateNameUncheckedJsOptionalChain.js
+// @target: es2015
0 commit comments