diff --git a/rules/S4124/javascript/rule.adoc b/rules/S4124/javascript/rule.adoc index 485abd6acf..e233442ec1 100644 --- a/rules/S4124/javascript/rule.adoc +++ b/rules/S4124/javascript/rule.adoc @@ -1,31 +1,42 @@ == Why is this an issue? -Declare a constructor inside an ``++interface++``, and you will get a simple method with the name "constructor". The same thing will happen if you create a ``++new++`` method inside the ``++interface++``: you'll get a simple method named "new". +JavaScript and TypeScript classes may define a `constructor` method that is executed when a new instance is created. TypeScript allows interfaces that describe a static class object to define a `new()` method. Using these terms to name methods in other contexts can lead to confusion and make the code unclear and harder to understand. + +This rule reports when: + +* A class defines a method named `new`. The `new` keyword is used to create new instances of the class. If a method with the same name is defined, it can be unclear whether the method is intended to create new instances or perform some other action. +* An interface defines a method named `constructor`. The constructor method is used to define the constructor function for a class that implements the interface. If a method with the same name is defined in the interface, it can be unclear whether the method is intended to define the constructor function or perform some other action. -Instead, the intent was probably to specify that the type did not originate from a TypeScript file. In such cases, just use the ``++declare class++`` syntax. - - -=== Noncompliant code example - -[source,javascript] +[source,javascript,diff-id=1,diff-type=noncompliant] ---- -interface TypeDeclaredElsewhere { - someMethod(): number; - new(b: boolean): TypeDeclaredElsewhere; // Noncompliant - constructor(b: boolean): void; // Noncompliant +interface I { + constructor(): void; // Noncompliant + new(): I; +} + +declare class C { + constructor(); + new(): C; // Noncompliant } ---- +Do not define methods named `constructor` on TypeScript interfaces. Similarly, avoid defining class methods called `new`. -=== Compliant solution - -[source,javascript] +[source,javascript,diff-id=1,diff-type=compliant] ---- -declare class TypeDeclaredElsewhere { - someMethod(): number; - constructor(b: boolean); +interface I { + new(): I; +} + +declare class C { + constructor(); } ---- - +== Resources +=== Documentation +* https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#interfaces[TypeScript - Interfaces] +* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes[MDN - Classes] +* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/constructor[MDN - `constructor`] +* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new[MDN - `new` operator] \ No newline at end of file