Constructor functions
When you declare a class in TypeScript, you are actually creating multiple declarations at the same time. The first is the type of the instance of the class.
class Greeter { greeting: string; constructor(message: string) { this.greeting = message; } greet() { return "Hello, " + this.greeting; } } let greeter: Greeter; greeter = new Greeter("world"); console.log(greeter.greet());
Here, when we say let greeter: Greeter
, we’re using Greeter
as the type of instances of the class Greeter
. This is almost second nature to programmers from other object-oriented languages.
We’re also creating another value that we call the constructor function. This is the function that is called when we new
up instances of the class. To see what this looks like in practice, let’s take a look at the JavaScript created by the above example:
let Greeter = (function () { function Greeter(message) { this.greeting = message; } Greeter.prototype.greet = function () { return "Hello, " + this.greeting; }; return Greeter; })(); let greeter; greeter = new Greeter("world"); console.log(greeter.greet());
Here, let Greeter
is going to be assigned the constructor function. When we call new
and run this function, we get an instance of the class. The constructor function also contains all of the static members of the class. Another way to think of each class is that there is an instance side and a static side.
Let’s modify the example a bit to show this difference:
class Greeter { static standardGreeting = "Hello, there"; greeting: string; greet() { if (this.greeting) { return "Hello, " + this.greeting; } else { return Greeter.standardGreeting; } } } let greeter1: Greeter; greeter1 = new Greeter(); console.log(greeter1.greet()); let greeterMaker: typeof Greeter = Greeter; greeterMaker.standardGreeting = "Hey there!"; let greeter2: Greeter = new greeterMaker(); console.log(greeter2.greet());
In this example, greeter1
works similarly to before. We instantiate the Greeter
class, and use this object. This we have seen before.
Next, we then use the class directly. Here we create a new variable called greeterMaker
. This variable will hold the class itself, or said another way its constructor function. Here we use typeof Greeter
, that is “give me the type of the Greeter
class itself” rather than the instance type. Or, more precisely, “give me the type of the symbol called Greeter
,” which is the type of the constructor function. This type will contain all of the static members of Greeter along with the constructor that creates instances of the Greeter
class. We show this by using new
on greeterMaker
, creating new instances of Greeter
and invoking them as before.
Please login to continue.