Both the private
keyword and private field are used to protect member variables in a class. In this shot, we will go through the differences between them.
The private
keyword is provided by TypeScript to give compile-time protection.
In the following example, we created a class, User
, which has a member variable id
, for which we provided the private
keyword. It tells the compiler that the id
property can only be accessed in the User
class.
The compiler will throw the error Property 'id' is private and only accessible within class 'User'
for the following code snippet, since we access the private member variable from outside the class in line 6.
class User{//declaring variable as private with private keywordprivate id = 1;}const user1 = new User();//accessing private variableconsole.log(user1.id);
The problem with this is that the private
keyword doesn’t exist in JavaScript, so it doesn’t provide runtime protection.
We can easily bypass compile-time protection with typecasting.
In the following code snippet, we access and print the variable that is protected by the private
keyword by typecasting user1
as any
type.
class User{//declaring variable as private with private keywordprivate id = 1;}const user1 = new User();//accessing private variableconsole.log((user1 as any).id);
The private field is newly added in JavaScript, and can also be used in TypeScript.
runtime
protection, as it is also available in JavaScript.#
before the variable.#id = 1;
In the following code snippet, we try to access a private field #id
from outside the class User
. It will throw the error Property '#id' is not accessible outside class 'User' because it has a private identifier
.
Note: If the following code snippet doesn’t throw the above-mentioned error, please try the code in the
. typescript https://www.typescriptlang.org/play/
class User{//declaring variable as private with private field#id = 1;}const user1 = new User();//accessing private variableconsole.log(user1.#id);
We cannot bypass it with typecasting, as it is also protected at runtime.