0

In strongly typed languages, like C# or Java, I can distinguish constructor signatures by argument types.

class Cars {

    Cars(string x, string y) {};
    Cars(string x, int y) {};

}

But without strong typing in JavaScript, I can only do this, which obviously will not work:

class Cars {

    Cars(x, y) {};
    Cars(x, y) {};

}

Am I limited to only the number of constructor arguments to distinguish them? Is there some way to create JS constructors that have the same number of args, but of different "types"?

How do I make constructors that know that it should be looking for an string y in the first constructor, but int y in the second?

Heretic Monkey
  • 11,687
  • 7
  • 53
  • 122
KWallace
  • 1,570
  • 1
  • 15
  • 25
  • 3
    perhaps use typescript – Lawrence Cherone Feb 20 '22 at 00:30
  • 1
    Short answer is you can't with JavaScript without some work-around. And a JS class can only have one defined as `constructor(){}`. – Tony Feb 20 '22 at 00:41
  • To make @Tony's comment clearer, the constructor in a JS class is always named `constructor`. The convention to name the constructor the same as the class stems from other languages like Java (which only has syntactical similarity with JavaScript). – connexo Feb 20 '22 at 00:44

1 Answers1

2

The only way to do this with JavaScript itself would be to use typeof checks inside the constructor body.

class Cars {
  constructor(x, y) {
    if (typeof x === 'string' && typeof y === 'string') {
      // implementation
    } else if (typeof x === 'string' && typeof y === 'number') {
      // implementation
    }
  }
}

If you were to use TypeScript, you could make the signatures more explicit and understood by good IDEs (for autocompletion and such) - but you'd still have to write out the tests to differentiate between different parameters inside the constructor itself for the emitted code. Not much of an improvement.

In JS and TS, there is only one constructor for a class - you can't have multiple depending on the types of arguments, you can only modify the one constructor to suit your purposes.

CertainPerformance
  • 356,069
  • 52
  • 309
  • 320