diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index bd9d4c4bc1cf9..01271cc95e170 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -13161,6 +13161,8 @@ namespace ts { checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarProperty(node) || checkGrammarComputedPropertyName(node.name); checkVariableLikeDeclaration(node); + + checkNameOfStaticMethodOrPropertyInClass(node); } function checkMethodDeclaration(node: MethodDeclaration) { @@ -13175,6 +13177,21 @@ namespace ts { if (node.flags & NodeFlags.Abstract && node.body) { error(node, Diagnostics.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract, declarationNameToString(node.name)); } + + checkNameOfStaticMethodOrPropertyInClass(node); + } + + function checkNameOfStaticMethodOrPropertyInClass(node: ClassElement) { + if (node.flags & NodeFlags.Static) { + const name = (node.name as Identifier).text; + switch (name) { + case "length": + case "name": + case "arguments": + case "caller": + error(node, Diagnostics._0_is_not_allowed_to_be_used_as_a_name_of_a_static_property_or_method_in_a_class, name); + } + } } function checkConstructorDeclaration(node: ConstructorDeclaration) { diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 46f1db9762502..78b3844e219f4 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1935,6 +1935,10 @@ "category": "Error", "code": 2688 }, + "'{0}' is not allowed to be used as a name of a static property or method in a class.": { + "category": "Error", + "code": 2689 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", "code": 4000 diff --git a/tests/baselines/reference/staticMemberOfClassAndPublicMemberOfAnotherClassAssignment.errors.txt b/tests/baselines/reference/staticMemberOfClassAndPublicMemberOfAnotherClassAssignment.errors.txt index 5962654080621..1485387649fdf 100644 --- a/tests/baselines/reference/staticMemberOfClassAndPublicMemberOfAnotherClassAssignment.errors.txt +++ b/tests/baselines/reference/staticMemberOfClassAndPublicMemberOfAnotherClassAssignment.errors.txt @@ -1,3 +1,4 @@ +tests/cases/compiler/staticMemberOfClassAndPublicMemberOfAnotherClassAssignment.ts(8,19): error TS2689: 'name' is not allowed to be used as a name of a static property or method in a class. tests/cases/compiler/staticMemberOfClassAndPublicMemberOfAnotherClassAssignment.ts(12,1): error TS2322: Type 'C' is not assignable to type 'A'. Property 'name' is missing in type 'C'. tests/cases/compiler/staticMemberOfClassAndPublicMemberOfAnotherClassAssignment.ts(13,1): error TS2322: Type 'typeof B' is not assignable to type 'A'. @@ -8,7 +9,7 @@ tests/cases/compiler/staticMemberOfClassAndPublicMemberOfAnotherClassAssignment. Property 'name' is missing in type 'typeof B'. -==== tests/cases/compiler/staticMemberOfClassAndPublicMemberOfAnotherClassAssignment.ts (4 errors) ==== +==== tests/cases/compiler/staticMemberOfClassAndPublicMemberOfAnotherClassAssignment.ts (5 errors) ==== interface A { name(); } @@ -17,6 +18,8 @@ tests/cases/compiler/staticMemberOfClassAndPublicMemberOfAnotherClassAssignment. } class C { public static name() { } + ~~~~ +!!! error TS2689: 'name' is not allowed to be used as a name of a static property or method in a class. } var a: A = new B();