TypeScript - Variable
TypeScript follows the same rules as JavaScript for variable declarations. Variables can be declared using: var
, let
, and const
.
var
Variables in TypeScript can be declared using var keyword, same as in JavaScript. The scoping rules remains the same as in JavaScript.
let
To solve problems with var
declarations, ES6 introduced two new types of variable declarations in JavaScript, using the keywords let
and const
.
TypeScript, being a superset of JavaScript, also supports these new types of variable declarations.
let employeeName = "John";
// or
let employeeName:string = "John";
The let declarations follow the same syntax as var declarations. Unlike variables declared with var
, variables declared with let
have a block-scope.
This means that the scope of let variables is limited to their containing block, e.g. function, if else block or loop block.
Consider the following example.
let num1:number = 1;
function letDeclaration() {
let num2:number = 2;
if (num2 > num1) {
let num3: number = 3;
num3++;
}
while(num1 < num2) {
let num4: number = 4;
num1++;
}
console.log(num1); //OK
console.log(num2); //OK
console.log(num3); //Compiler Error: Cannot find name 'num3'
console.log(num4); //Compiler Error: Cannot find name 'num4'
}
letDeclaration();
In the above example, all the variables are declared using let. num3
is declared in the if block so its scope is limited to the if block and cannot be accessed out of the if block.
In the same way, num4
is declared in the while
block so it cannot be accessed out of while block.
Thus, when accessing num3
and num4
else where will give a compiler error.
The same example with the var declaration is compiled without an error.
var num1:number = 1;
function varDeclaration() {
var num2:number = 2;
if (num2 > num1) {
var num3: number = 3;
num3++;
}
while(num1 < num2) {
var num4: number = 4;
num1++;
}
console.log(num1); //2
console.log(num2); //2
console.log(num3); //4
console.log(num4); //4
}
varDeclaration();
Advantages of using let over var
1) Block-scoped let variables cannot be read or written to before they are declared.
console.log(num1); // Compiler Error: error TS2448: Block-scoped variable 'num' used before its declaration
let num1:number = 10 ;
console.log(num2); // OK, Output: undefined
var num2:number = 10 ;
In the above example, the TypeScript compiler will give an error if we use variables before declaring them using let, whereas it won't give an error when using variables before declaring them using var.
2) Let variables cannot be re-declared
The TypeScript compiler will give an error when variables with the same name (case sensitive) are declared multiple times in the same block using let.
var num:number = 1; // OK
var Num:number = 2;// OK
var NUM:number = 3;// OK
var NuM:number = 4;// OK
let num:number = 5;// Compiler Error: Cannot redeclared block-scoped variable 'num'
let Num:number = 6;// Compiler Error: Cannot redeclared block-scoped variable 'Num'
let NUM:number = 7;// Compiler Error: Cannot redeclared block-scoped variable 'NUM'
let NuM:number = 8;// Compiler Error: Cannot redeclared block-scoped variable 'NuM'
In the above example, the TypeScript compiler treats variable names as case sensitive. num
is different than Num
, so it won't give any error. However, it will give an error for the variables with the same name and case.
Variables with the same name and case can be declared in different blocks, as shown below.
let num:number = 1;
function demo() {
let num:number = 2;
if(true) {
let num:number = 3;
console.log(num); //Output: 3
}
console.log(num);//Output: 2
}
console.log(num); //Output: 1
demo();
Similarly, the compiler will give an error if we declare a variable that was already passed in as an argument to the function, as shown below.
function letDemo(a: number ) {
let a:number = 10 ; //Compiler Error: TS2300: Duplicate identifier 'a'
let b:number = 20 ;
return a + b ;
}
Thus, variables declared using let
minimize the possibilities of runtime errors, as the compiler give compile-time errors. This increases the code readability and maintainability.
Const
Variables can be declared using const similar to var or let declarations. The const makes a variable a constant where its value cannot be changed. Const variables have the same scoping rules as let variables.
const num:number = 100;
num = 200; //Compiler Error: Cannot assign to 'num' because it is a constant or read-only property
Const variables must be declared and initialized in a single statement. Separate declaration and initialization is not supported.
const num:number; //Compiler Error: const declaration must be initialized
num = 100;
Const variables allow an object sub-properties to be changed but not the object structure.
const playerCodes = {
player1 : 9,
player2 : 10,
player3 : 13,
player4 : 20
};
playerCodes.player2 = 11; // OK
playerCodes = { //Compiler Error: Cannot assign to playerCodes because it is a constant or read-only
player1 : 50, // Modified value
player2 : 10,
player3 : 13,
player4 : 20
};
Even if you try to change the object structure, the compiler will point this error out.
const playerCodes = {
player1: 9,
player2: 10,
player3: 13,
player4: 20
};
playerCodes = { //Compiler Error: Cannot assign to playerCodes because it is a constant or read-only
player1: 9,
player2: 10,
player3: 13,
player4: 20,
player5: 22
};