about typescript

about typescript

typescript, জাভাসচ্রিপ্টের একটা আপডেটেড ভার্শন । এটা তৈরি করেছে microsoft । it's allows static strict typing . সাথে আছে অনেক এক্সট্রা ফিচার । যেমনঃ interfaces, enums, tuples, generics . আর সাথে থাকছে modern javascript এঁর সাপোর্ট । typescript কোণ প্রোগ্রামিং ল্যাঙ্গুয়েজ নয় । এটা পেছনে javascript এ কনভার্ট করে । based on the .NET harmony specification’s.

javascript এ wrong ছিল যার কারণে typescript কে আসতে হল ?

  1. not suitable for larger application

  2. javascript প্রথমে এসেছিল ছোট ছোট ওয়েব অ্যাপ্লিকেশাণে interectivity যোগ করতে । পরবর্তীতে javascript এঁর প্রসার ঘটলে চিন্তা করতে হয় যে কিভাবে বড় বড় অ্যাপ্লিকেশান হ্যান্ডেল করা যায় । সেখান থেকেই typescript এঁর উৎপত্তি ।

  3. যারা অন্য প্রোগ্রামিং ল্যাঙ্গুয়েজ থেকে আস্তও তাদের কাছে javascript এঁর syntax অনেক weired লাগত সেখান থেকেই মুক্তি দিতে typescript এসেছে

  4. জাভাসচ্রিপ্ট এ আমরা রানটাইমে এরর আমরা পাচ্ছিলাম । typescript এ যেটা কোড করার সময় পাওয়া যায় ।

  5. suffers type coercion

এখন আসই typescript এঁর সুবধা নিয়ে ।

  1. typescript আসলে avascript যা নতুন করে শেখার মত কিছুই নেই । কিছু syntax জনলেই typescript সম্পর্কে ভালো ধারনা হয়ে যাবে

  2. new features work everywhere

typescript কিভাবে ইন্সটল করব ?

  1. node js ইন্সটল করা থাকতে হবে

  2. install typescript compilar

npm i -g typescript

এটা ইন্সটল করার মাধ্যমে আমাদের pc তে tsc নামক একটা কমান্ড রান হয়ে গেল । যেটা ব্যাবহার করে আমরা typescript এঁর কাজ করতে পারব

ব্যাবহার বিধি ঃ

  1. create a script.ts file

    .ts file সাপোর্ট করবে না তাই একে ম্যানুয়ালি compile করতে হবে । তার জন্য এই কমান্ড প্রয়োজন পরবে ।

     tsc script.ts
    

    এই কমান্ড একটা script.js ফাইল তৈরি করে দিবে । যেটা হবে আমাদের application এ ব্যাবহার যোগ্য javscript ফাইল

  2. link this script.js file

এখানে আমরা একটা সমস্যার সমক্ষিন হচ্ছি সেটা হল ম্যানুয়ালি আমাদেরকে .ts থেকে .js এ কনভার্ট করতে হচ্ছে ।

এটা থেকে পরিত্রাণ পেতে আমরা আমরা একটা কমান্ড দিতে পারি । যা আমাদের নতুন কোড অটোমেটিকালি কম্পাইন হয়ে যাবে

tsc --init 
// message: successfully create a jsconfig.json file 
// এটা করার পরও কাজ হবে না । এর জন্য আর একটা কমান্ড দিতে হবে । সেটা হলঃ 
tsc -w

আমরা suffers type coercion নামে একটা পয়েন্ট বলে এসেছি । এঁর ব্যাবহার এখন দেখি

const name = "rashedul"
name = 32 // eta eror দিবে কারণ এখানে string কে number এ কনভার্ট করতে পাচ্ছে না । 
const age = 32 
age = 35 // it's work perfectly 

// কিন্তু এই কাজটা করলে কি আসে চিন্তা করুন তো ? 
let myName;
myName = "rashedul";
myName = 43;
console.log(myName) 
// এটা কোণ error দেখাবে না । কারণ এখানে intially কোণ টাইপ চেকিং নেই এটা undefined অবস্থায় ছিল । পরবর্তীতে string, number, boolean হোক তাতে তার কোণ সমস্যা নেই ।

// --------------------------------------------
function sum ( a , b ) {
  //           👆  👆  এই ২ যায়গায় warning দিবে কারণে এখানে type cheking নেই। একজন বাবহারকারি চাইলে যেকোনো কিছু আর্গুমেন্ট হিসেবে পাস করতে পারে । যেটা typescript করতে দিবে না 
    return a + b 
}
console.log(sum(1,3))

// 🚦🚦🚦🚦✅ solving 
function sum ( a : number , b : number  ) {
                     👆           👆  
     return a + b 
};
console.log(sum(1,3))

// --------------------------------------------

// array 
let names = ["rashedul", "islam", "shihab"]
names.push(32) // 🚫❗️ it's shows a warning.  

let names = ["rashedul", "islam", "shihab" , 18 , true]
names.push(32) // ✅✅ not showing warning
names.push({ name: "shihab" }) // 🚫❗️ it's shows a warning . যদি names array তে একটা  ব্ল্যাংক অবজেক্ট {} দিতেন তাহলে এরর দিত না

// -------------------------------------------- 
let a : string;
let b : number;
// ----------------
a : "rashedul"
a : 10 // shows an error
// ----------------
b : 10;
b : "rashedul" // shows an error

let arr = string[] = [] // স্ট্রিং এঁর array 
                     👆 ইনিশিয়াল ভেলু 
let arr = (string | number)[] = [] // স্ট্রিং ও নাম্বার এঁর array 

// --------------------------------------------
let arr2 : object; 
arr2 = ["name","email"] // not showing error. because array is an object

dynamic type or any type

let a : any;
let a : any[] = []; // any type of array

function

let myfunc : Function;
myfunc = ( ) => { console.log("hello") }

// --------------------------------------------
const csFunc = (a:string, b:number, c?:boolean)=>{
//                                   👆 optional 
       console.log(`hello ${a} ${b}`)
}

// --------------------------------------------
const csFunc = (a:string, b:number, c?:boolean = true ) => {
//                                   👆 optional with default value
       console.log(`hello ${a} ${b}`)
}

// --------------------------------------------
const csFunc = (a:string, b:number) :number  => {
       console.log(`hello ${a} ${b}`)
}// এই ফাংশন টা একটা number return করবে সেঁটাই বোঝানো হচ্ছে ।

type aliases

let user = {id:number|string,user:{name:string,email:string}}
let user2 = {user:{name:string,email:string}}
// এখানে দেখুন user এঁর type cheking একদম সেম কিন্তু ২ বার আলাদা করে লেখতে হয়েছে । এটার সমাধান করতে পারি এইভাবে

// --------------------------------------------
type numberOrString = number|string;
type userType = {name:string,email:string}; 

let user = { id: numberOrString, user: userType };
let user2 = {user: userType };

Function Signatures

let myFunc = (a:number,b:number) => number ; //Function Signatures
myFunc = (a:number,b:number) => a + b ;

classes

const player {
    name:string,
    age:number,
    country:string,
    constructor(n:string, a:number, c:string){
        this.name = n;
        this.age = ca;
        this.country: c;    
    }

    play(){
    console.log(`${this.name} is playing `)
    }    
}

const rashedul = new player("rashedul",30,"BD");
const islam = new player("islam",20,"BD");
// --------------------------------------------
const players = player[] = [] // এটা প্লেয়ার ক্লাসের একটা array
players.push(rashedul);
players.push(islam)

Access Modifier

const player {
    privet name:string,
    public age:number,
    public country:string,
    readonly role: string,
    constructor(n:string, a:number, c:string){
        this.name = n;
        this.age = ca;
        this.country: c;    
    }

    play(){
    console.log(`${this.name} is playing `)
    }    
}

const rashedul = new player("rashedul",30,"BD","ADMIN");
const islam = new player("islam",20,"BD","STDUNT");

// এখানে rashedul.age অর্থাৎ ভেতরের প্রপার্টি বাহির থেকে অ্যাক্সেস করা যাচ্ছে । তার মানে বাহির থেকে আপডেট অ করা যাবে । কারণ ক্লাসের প্রপার্টি গুলো public হয়ে আছে । যেমনটা এই উদাহরণে দেখানো হয়েছে । যেখানে name প্রপার্টিটা privet অন্য গুলো public . name বাহির থেকে অ্যাক্সেস করা =যাবে না । আর role কে বাহির থেকে আপডেট করা যাবে না কিন্তু অ্যাক্সেস করা যাবে কারণ একটা readonly. 

// যেমন  ঃ 
console.log(rashedul.name) // not visible 
console.log(rashedul.age) // it's visible
rashedul.role="STUDENT" // not editable  but visible from outside

module system

// edded something very soon

Interfaces

interface rectangleOptions {
    width:number;
    height:number
}
const drawRectangle = (options:rectangleOptions) {
    let width = options.width;
    let height = options.height;
}
drawRectangle({
width:200,
height:300
});

interface uses on class

// class এ interface ব্যাবহার 
export interface Isplayer {
    name:string,
    age:number,
    country:string,
    play() : void
};

const player implements Isplayer {

    constructor(   
        public name:string,
        public age:number,
        public country:string,
        readonly role: string
    ){}
    play(){
       console.log(`${this.name} is playing `)
    }    
}

Generics

যদি কোণ কিছু টাইপ আগে থেকে জানা না থাকে তখন আমরা Generics ব্যাবহার করি ।

const objMaker = (obj:object) => {
   let id = genetateId();
   return {...obj,id}
};
let user = objMaker({name:"rs",age:18,country:"BD"})
console.log(user.id)
// এখন মোদী আমরা user থেকে তার property গুলো অ্যাক্সেস করতে চাই তাহলে আমরা id বাদে কোণ কিছুরই suggestions পাব না । পাইতে হলে আমাদের Generics way ৎ চিন্তা করতে হবে । যেটা করতে পারি এইভাবে 

// ----------------------------------------- 
const objMaker = <T>(obj: T) => {
   let id = genetateId();
   return {...obj,id}
};
let user = objMaker({name:"rs",age:18,country:"BD"})
// এখন user object এ কি কি প্রপার্টি আছে তার সাজেশন দিবে ।কিন্তু এখানে একটা সমস্যা আছে। সব ইউজার যে শুধু object ই পাস করবে এমন না । এখানে যেকোনো type এঁর ডাটা পাস করা যাবে সেঁতা তো আমরা করতে দিতে চাচ্ছি না । তার জন্য আমরা এই কাজটা করতে পারি । 
const objMaker = <T extends object>(obj: T) => {
   let id = genetateId();
   return {...obj,id}
}; // এখন অবজেক্ট বাদে অন্য কোন type এঁর ডাটা পাস করা যাবে না 
//------------------------------------------------------
// আবার আমরা একটাও বলে দিতে পারি যে অবজেক্ট এঁর প্রপার্টি type কি হবে 

const objMaker = <T extends {name:string, age:number}>(obj: T) => {
   let id = genetateId();
   return {...obj,id}
};

Generics uses on interface

interface useInterface<T> {
    name:string,
    age:number,
    country:string,
    data: T
};
const res1 : useInterface<object> = {
                          👆 এখান থেকে যা পাঠাব তাই T হিসেবে পাবে       
    name:"rashedul",
    age:19,
    country:"BD"
        data:{
            role:"admin",
            class:"XI",
      }
};

ENUMS types

enum RolType {"ADMIN","USER","STUDENT"}
interface useInterface<T> {
    name:string,
    age:number,
    role:RolType,
    data: T
};
const res1 : useInterface<string> = {
    name:"rashedul",
    age:19,
    role:RolType.ADMIN // admin কত নাম্বার ইনডেক্সে আছে তার ভেলু রিটার্ন করবে 
    data:"rashedul islam shihab"
};

tuples

let a = [3,"dfb",{t:2}]
let b : [number,string,object] = [4,"hi",{t:4}]

Did you find this article valuable?

Support Rashedul's Article by becoming a sponsor. Any amount is appreciated!