Learn TypeScript
Using access modifiers
Using access modifiers
In this lesson, we'll learn the different access modifiers available to class members and how to implement them.
Public members
We are going to explore access modifiers in classes in an exercise.
The code contains the Product
class we worked on in the last lesson, along with instances of this class in variables table1
and table2
.
- Let's try to access and change the
price
field outside the class definition, in the consuming code:
table1.price = 100;
Are any errors raised on this assignment?
Class members are public by default, which means consuming code can access them.
Readonly fields
We can make fields readonly using a readonly
modifier before the field name:
readonly readonlyField: TypeName;
- Make the
price
field readonly so that thetable1.price = 100;
raises a type error.
Private members
We must use the private
keyword in front of a class member to make it private and not accessible by consuming code.
Remove the
readonly
keyword from theprice
field.Make the
name
andprice
fields private.
Is the table1.price = 100
assignment raising an error now?
- Output
table1
to the console after thetable1.price = 100
assignment:
console.log(table1);
Is the table1.price
actually changed, or does the private
keyword prevent this from happening? Have a look in the console to find out.
TypeScript access modifiers don't take any effect on the code at runtime.
Private members in JavaScript
Recent versions of JavaScript support private fields that do take effect at runtime. However, the syntax is different to TypeScript. Instead of using the private
keyword, the hash (#
) symbol is used.
So, our example could use JavaScript private fields as follows:
#name: string;#price: number;
Unfortunately, our code editor doesn't support this syntax yet. You can experiment with JavaScript private fields in the TypeScript playground.
Protected members
The final access modifier is protected
.
What do you think the protected
access modifier does?
Constructor assignment
There is TypeScript syntax that allows us to create and initialize fields in a constructor concisely.
constructor(accessModifier fieldName1: type1, accessModifier fieldName2: type2, ...) { }
Use this syntax and refactor the name
and price
fields in the the Product
class to make the implementation more concise:
Neat!
Summary
We can enforce class member access using the public
, private
, and protected
accessors. It is important to be aware that it is TypeScript enforcing this access at development time and not at runtime.
Next, we will learn how to enforce the structure of a class with an interface.