Skip to content

Commit 4701eb7

Browse files
Merge pull request microsoft#12357 from mylesmegyesi/12075-incorrectErrorMessageForUseOfTypeAsNamespace
Fixes error message when Type is used as a Namespace
2 parents 855431a + d8b0f23 commit 4701eb7

7 files changed

+46
-6
lines changed

src/compiler/checker.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,7 @@ namespace ts {
922922
if (!errorLocation ||
923923
!checkAndReportErrorForMissingPrefix(errorLocation, name, nameArg) &&
924924
!checkAndReportErrorForExtendingInterface(errorLocation) &&
925+
!checkAndReportErrorForUsingTypeAsNamespace(errorLocation, name, meaning) &&
925926
!checkAndReportErrorForUsingTypeAsValue(errorLocation, name, meaning)) {
926927
error(errorLocation, nameNotFoundMessage, typeof nameArg === "string" ? nameArg : declarationNameToString(nameArg));
927928
}
@@ -1032,6 +1033,18 @@ namespace ts {
10321033
}
10331034
}
10341035

1036+
function checkAndReportErrorForUsingTypeAsNamespace(errorLocation: Node, name: string, meaning: SymbolFlags): boolean {
1037+
if (meaning === SymbolFlags.Namespace) {
1038+
const symbol = resolveSymbol(resolveName(errorLocation, name, SymbolFlags.Type & ~SymbolFlags.Value, /*nameNotFoundMessage*/undefined, /*nameArg*/ undefined));
1039+
if (symbol) {
1040+
error(errorLocation, Diagnostics._0_only_refers_to_a_type_but_is_being_used_as_a_namespace_here, name);
1041+
return true;
1042+
}
1043+
}
1044+
1045+
return false;
1046+
}
1047+
10351048
function checkAndReportErrorForUsingTypeAsValue(errorLocation: Node, name: string, meaning: SymbolFlags): boolean {
10361049
if (meaning & (SymbolFlags.Value & ~SymbolFlags.NamespaceModule)) {
10371050
const symbol = resolveSymbol(resolveName(errorLocation, name, SymbolFlags.Type & ~SymbolFlags.Value, /*nameNotFoundMessage*/undefined, /*nameArg*/ undefined));

src/compiler/diagnosticMessages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1995,6 +1995,10 @@
19951995
"category": "Error",
19961996
"code": 2701
19971997
},
1998+
"'{0}' only refers to a type, but is being used as a namespace here.": {
1999+
"category": "Error",
2000+
"code": 2702
2001+
},
19982002

19992003
"Import declaration '{0}' is using private name '{1}'.": {
20002004
"category": "Error",

tests/baselines/reference/invalidImportAliasIdentifiers.errors.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
tests/cases/conformance/internalModules/importDeclarations/invalidImportAliasIdentifiers.ts(5,12): error TS2503: Cannot find namespace 'V'.
22
tests/cases/conformance/internalModules/importDeclarations/invalidImportAliasIdentifiers.ts(11,12): error TS2503: Cannot find namespace 'C'.
3-
tests/cases/conformance/internalModules/importDeclarations/invalidImportAliasIdentifiers.ts(23,12): error TS2693: 'I' only refers to a type, but is being used as a value here.
3+
tests/cases/conformance/internalModules/importDeclarations/invalidImportAliasIdentifiers.ts(23,12): error TS2702: 'I' only refers to a type, but is being used as a namespace here.
44

55

66
==== tests/cases/conformance/internalModules/importDeclarations/invalidImportAliasIdentifiers.ts (3 errors) ====
@@ -32,5 +32,5 @@ tests/cases/conformance/internalModules/importDeclarations/invalidImportAliasIde
3232

3333
import i = I;
3434
~
35-
!!! error TS2693: 'I' only refers to a type, but is being used as a value here.
35+
!!! error TS2702: 'I' only refers to a type, but is being used as a namespace here.
3636

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
tests/cases/compiler/invalidUseOfTypeAsNamespace.ts(4,16): error TS2702: 'OhNo' only refers to a type, but is being used as a namespace here.
2+
3+
4+
==== tests/cases/compiler/invalidUseOfTypeAsNamespace.ts (1 errors) ====
5+
interface OhNo {
6+
}
7+
8+
declare let y: OhNo.hello;
9+
~~~~
10+
!!! error TS2702: 'OhNo' only refers to a type, but is being used as a namespace here.
11+
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
//// [invalidUseOfTypeAsNamespace.ts]
2+
interface OhNo {
3+
}
4+
5+
declare let y: OhNo.hello;
6+
7+
8+
//// [invalidUseOfTypeAsNamespace.js]

tests/baselines/reference/strictModeReservedWordInClassDeclaration.errors.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ tests/cases/compiler/strictModeReservedWordInClassDeclaration.ts(21,9): error TS
1616
tests/cases/compiler/strictModeReservedWordInClassDeclaration.ts(21,17): error TS1213: Identifier expected. 'private' is a reserved word in strict mode. Class definitions are automatically in strict mode.
1717
tests/cases/compiler/strictModeReservedWordInClassDeclaration.ts(23,20): error TS1213: Identifier expected. 'public' is a reserved word in strict mode. Class definitions are automatically in strict mode.
1818
tests/cases/compiler/strictModeReservedWordInClassDeclaration.ts(25,20): error TS1213: Identifier expected. 'public' is a reserved word in strict mode. Class definitions are automatically in strict mode.
19-
tests/cases/compiler/strictModeReservedWordInClassDeclaration.ts(25,20): error TS2693: 'public' only refers to a type, but is being used as a value here.
19+
tests/cases/compiler/strictModeReservedWordInClassDeclaration.ts(25,20): error TS2702: 'public' only refers to a type, but is being used as a namespace here.
2020
tests/cases/compiler/strictModeReservedWordInClassDeclaration.ts(26,21): error TS1213: Identifier expected. 'public' is a reserved word in strict mode. Class definitions are automatically in strict mode.
21-
tests/cases/compiler/strictModeReservedWordInClassDeclaration.ts(26,21): error TS2693: 'public' only refers to a type, but is being used as a value here.
21+
tests/cases/compiler/strictModeReservedWordInClassDeclaration.ts(26,21): error TS2702: 'public' only refers to a type, but is being used as a namespace here.
2222
tests/cases/compiler/strictModeReservedWordInClassDeclaration.ts(27,17): error TS1213: Identifier expected. 'package' is a reserved word in strict mode. Class definitions are automatically in strict mode.
2323
tests/cases/compiler/strictModeReservedWordInClassDeclaration.ts(27,17): error TS2304: Cannot find name 'package'.
2424
tests/cases/compiler/strictModeReservedWordInClassDeclaration.ts(28,17): error TS1213: Identifier expected. 'package' is a reserved word in strict mode. Class definitions are automatically in strict mode.
@@ -88,12 +88,12 @@ tests/cases/compiler/strictModeReservedWordInClassDeclaration.ts(28,17): error T
8888
~~~~~~
8989
!!! error TS1213: Identifier expected. 'public' is a reserved word in strict mode. Class definitions are automatically in strict mode.
9090
~~~~~~
91-
!!! error TS2693: 'public' only refers to a type, but is being used as a value here.
91+
!!! error TS2702: 'public' only refers to a type, but is being used as a namespace here.
9292
class F1 implements public.private.implements { }
9393
~~~~~~
9494
!!! error TS1213: Identifier expected. 'public' is a reserved word in strict mode. Class definitions are automatically in strict mode.
9595
~~~~~~
96-
!!! error TS2693: 'public' only refers to a type, but is being used as a value here.
96+
!!! error TS2702: 'public' only refers to a type, but is being used as a namespace here.
9797
class G extends package { }
9898
~~~~~~~
9999
!!! error TS1213: Identifier expected. 'package' is a reserved word in strict mode. Class definitions are automatically in strict mode.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
interface OhNo {
2+
}
3+
4+
declare let y: OhNo.hello;

0 commit comments

Comments
 (0)