- prerequisities: Javascript
Chapters:
-
Introduction
-
Environment setup
-
First Typescript program
-
Data Types - built-in
- number, string, boolean, void, undefined, null
-
Data Types - user-defined
- union type
- Array type
- tuple type
- enum type
- any type
- object type
- custom type
-
class
- class basic, object
- inheritance
- abstract class
- Encapsulation and access modifiers
-
interface
-
Generic
-
Module- export, import
-
typescript configuration
-
Build tools
-
convert js project to ts
- In a simple words, Types + JavaScript = TypeScript
- It is a superset of JS
- developed and maintained by Microsoft
- JS Check types in run time while typescript add static typing to JS so we can handle errors before running the program.
- increase readability and code quality
- popular JS libraray Angular use TypeScript.
- It can be used in both: client and server side.
- Intellisense IDE Support while coding: code completion, content assist and code hinting
- earlier versions
- TypeScript 1.0 October 2014
- TypeScript 2.0 September 2016
- TypeScript 3.0 July 2018
- TypeScript 4.0 - latest release August 2020
// index.js
// without typescript
function addNumbers(num1, num2) {
console.log(num1 + num2);
}
addNumbers(20, 30);
addNumbers(20, "30");
// with typescript
// without typescript
function addNumbers(num1: number, num2: number) {
console.log(num1 + num2);
}
addNumbers(20, 30); // no error
addNumbers(20, "30"); // error
// without typescript
let x;
x = 20; // correct
x = "anisul"; // correct
x = true; // correct
x = [10, 20]; // correct
// with typescript
let x: number;
x = 20; // correct
x = "20"; // Not correct
x = true; // Not correct
x = [10, 20]; // Not correct
-
Text Editor: VS Code
-
Install node & typescript
npm intsall typescript --save-dev (local) npm install -g typescript (global) npx tsc fileName.ts
-
check various versions:
node --version npm --version tsc --version
- index.ts -> tsc index.ts -> index.js
-
typescript file extension is .ts
-
Run the following program using
tsc index.ts
command and thennode index.js
// index.ts // without ts function addNumbers(num1, num2) { console.log(num1 + num2); } addNumbers(20, 30); addNumbers(20, "30"); // correct one using ts function addNumbers(num1: number, num2:number) { console.log(num1 + num2); } addNumbers(20, 30); addNumbers(20, "30"); let num1 = 20; console.log(num1); let name= "anisul islam"; name. //intellisense support will be here
-
some compiler flag
- tsc index.js --watch
-
Any (super type)
- built in types: number, string, boolean, void, null, undefined etc.
- user-defined types: Arrays, Enums, Classes, interfaces etc.
-
example of built-in types
// string TYPE EXAMPLE let firstName: string; let lastName: string; let fullName: string; let occupation: string; firstName = "Anisul"; lastName = " Islam"; occupation = "student"; console.log(firstName); console.log(lastName); console.log(occupation); // toUpperCase() console.log(firstName.toUpperCase()); // toLowerCase() console.log(firstName.toLowerCase()); // split([separator[,limit]]) console.log(fullName.split(" ")); // concat() fullName = firstName.concat(lastName); console.log(`User ${fullName} is a ${occupation}`); let userName: string; let id: number; let isLoggedIn: boolean; console.log(userId.toLowerCase()); // error here function display(): void { console.log("Hi I am display"); } display();
-
inferred Typing
let userName = "anis"; // data type inferred as string
-
Union Type - more than one type for variable or function parameter
let userId: string | number; // userId = 101; // no error // userId = "101"; // no error // userId = true; // error function userIdDataType(userId: string | number) { console.log(typeof userId); } userIdDataType("123"); // no error userIdDataType(123); // no error // userIdDataType(true); // error
-
Array Type- similar data
// let users = ["anis", "rabu", "pinky"]; // let users: string[]; // users = ["anis", "rabu", "pinky"]; let users: Array<string>; users = ["anis", "rabu", "pinky"]; // for (let index = 0; index < users.length; index++) { // const element = users[index]; // console.log(element); // } // users.forEach((element) => { // console.log(element); // }); users.sort(); console.log(users); users.push("limon"); console.log(users); users.pop(); console.log(users); users.unshift("milton"); console.log(users); users.shift(); console.log(users); // multi-types array // let users: (number | string)[]; // users = [10, "anis", 25, 35, "islam"];
-
Tuple Type - Mixed data type
let users: [number, String]; users = [101, "anis"]; console.log(users); console.log(users[0]); console.log(users[1]); users.push(102, "sakib"); console.log(users);
-
Enum Type: no duplicate data, helps to store constants
// enum example // helps us to store constants // numeric enum enum UserRequest { ReadData, // ReadData = 2, SaveData, UpdateData, } console.log(UserRequest); console.log(UserRequest.ReadData); console.log(UserRequest.SaveData); // string enum enum UserRequest { ReadData = "READ_DATA", // ReadData = 2, SaveData = "SAVE_DATA", UpdateData = "UPDATE_DATA", } console.log(UserRequest); console.log(UserRequest.ReadData); console.log(UserRequest.SaveData); console.log(UserRequest["UpdateData"]); // Heterogeneous enum enum User { id = 101, name = "anisul", }
-
any Type: if you have no knowledge about the variable type use any type: user input values
let password: any; let passwords: any[];
-
object Type: can store value as key value pair
let names: object; names = { name1: "anis" }; console.log(names); let users: object[]; users = []; let user1: { userName: string, userId: number }; user1 = { userName: "anis", userId: 101 }; users.push(user1); let user2: { userName: string, userId: number }; user2 = { userName: "rabu", userId: 102 }; users.push(user2); for (const key in users) { console.log(users[key]["userName"]); }
-
custom Type: you can create your own type
type User = { userName: string, userId: number }; let users: User[]; users = []; let user1: User; user1 = { userName: "anis", userId: 101 }; users.push(user1); let user2: User; user2 = { userName: "rabu", userId: 102 }; users.push(user2); let user3: User; user3 = { userName: "lucky", userId: 103 }; users.push(user3); // console.log(users); type RequestType = "GET" | "POST"; let getRequest: RequestType; getRequest = "GET"; function requestHandler(requestType: RequestType) { console.log(requestType); } requestHandler("GET");
-
class can have constructor, properties, methods
-
create object - let objectName = new className();
-
Example
class User { // properties, methods, constructor userName: string; age: number; constructor(userName: string, age: number) { this.userName = userName; this.age = age; } display(): void { console.log(`username: ${this.userName}, age: ${this.age}`); } } let user1 = new User("Anisul Islam", 25); user1.display(); let user2 = new User("Rabeya Islam", 31); user2.display();
- inheritance helps us to acquire properties of one class to another
class User {
userName: string;
age: number;
constructor(userName: string, age: number) {
this.userName = userName;
this.age = age;
}
display(): void {
console.log(`username: ${this.userName}, age: ${this.age}`);
}
}
class Student extends User {
studentId: number;
constructor(userName: string, age: number, studentId: number) {
super(userName, age);
this.studentId = studentId;
}
display(): void {
console.log(
`username: ${this.userName}, age: ${this.age}, id: ${this.studentId}`
);
}
}
let student1 = new Student("keya", 31, 1302020015);
student1.display();
let user1 = new User("Anisul Islam", 25);
user1.display();
// let user2 = new User("Rabeya Islam", 31);
// user2.display();
-
abstraction helps us to hide the implementation of something
-
class declared with abstract keyword
-
object can not be created from abstract class
-
if a class extends abstract class; it must inherit all the abstract methods
-
example
abstract class User { userName: string; age: number; constructor(userName: string, age: number) { this.userName = userName; this.age = age; } abstract display(): void; } class Student extends User { studentId: number; constructor(userName: string, age: number, studentId: number) { super(userName, age); this.studentId = studentId; } display(): void { console.log( `username: ${this.userName}, age: ${this.age}, id: ${this.studentId}` ); } } let student1 = new Student("keya", 31, 1302020015); student1.display();
-
4 key principles of Object Oriented Programming (OOP): Inheritance, Abstraction, Encapsulation, Polymorphism.
-
Encapsulation helps us to manage the visibility of class members.
-
Access modifiers: public, private, protected, readonly
-
example
// public, private, protected, readonly class User { readonly userName: string; public age: number; constructor(userName: string, age: number) { this.userName = userName; this.age = age; } display(): void { console.log(`username: ${this.userName}, age: ${this.age}`); } } class Student extends User { private studentId: number; constructor(userName: string, age: number, studentId: number) { super(userName, age); this.studentId = studentId; } display(): void { console.log( `username: ${this.userName}, age: ${this.age}, id: ${this.studentId}` ); } setStudentId(studentId: number): void { this.studentId = studentId; } getStudentId(): number { return this.studentId; } } let student1 = new Student("keya", 31, 1302020015); student1.setStudentId(1302020017); console.log(student1.getStudentId()); // student1.display(); let user1 = new User("robi", 23); console.log(user1.userName); // user1.display();
- interface