Typescript là một ngôn ngữ siêu cú pháp, là ngôn ngữ mã nguồn mở của JavaScript được phát triển và duy trì và mở rộng bởi Microsoft. Hiện Typescript đang là một ngôn ngữ lập trình phổ biến trong môi trường lập trình frontend.
Và có rất nhiều lập trình viên khẳng định họ muốn tìm hiểu và sử dụng ngôn ngữ lập trình Typescript trong những dự án tiếp theo của họ. Còn điều gì thú vị mà Typescript trở nên hot và được nhiều người quan tâm đến vậy. Hãy cùng trung tâm Testerpro tìm hiểu về Typescript là gì và lý do nên sử dụng Typescript qua bài viết dưới đây.
Typescript là gì?
Giống như tên gọi của nó, đây là một ngôn ngữ kịch bản mã nguồn mở, có thể sử dụng và phát triển ở trên các ứng dụng chạy trên ở Client-side (Angular 2) và server-side(NodeJS). Typescript dùng để thiết kế và xây dựng các dự án đáp ứng được các ứng dụng quy mô lớn mang tính chất phức tạp.
Khác với sự đơn giản của Javascript, Typescript thừa hưởng nhiều định nghĩa cũng như các khái niệm của đa dạng các ngôn ngữ lập trình của Java, C#,… tuy nhiên Typescript có những yêu cầu và trật tự ở mức độ cao hơn và rõ ràng hơn.
Nó được xem là một phiên bản cao cấp hơn của JavaScript, vì nó được kế thừa và cải tiến thêm các chức năng tiện lợi và khắc phục được những điểm yếu của JavaScript như các lớp hướng đối tượng và Static Structural và nó được sử dụng linh hoạt và rộng rãi trong các ứng dụng của ngôn ngữ lập trình Nodejs và Angular.
Lý do nên sử dụng Typescript
Dễ phát triển trong các dự án lớn
Được sử dụng trong các kỹ thuật mới nhất và lập trình hướng đối tượng nên nó giúp chúng ta phát triển các dự án một cách dễ dàng nhất. Typescript giúp khắc phục các lỗi compile time do không phát hiện tự động như việc gán các dữ liệu sai kiểu hay việc tạo ra các class khó khăn khiến các lập trình không muốn sử dụng Javascript dó đo Typescript đã khắc phục lỗi trên và áp dụng kỹ thuật mới ES6 và có thể làm việc với các kiểu dữ liệu tĩnh giúp kiểm soát được dữ liệu chặt chẽ hơn, …
Hỗ trợ nhiểu Framework
Hiện nay các javascript framework khuyến khích người sử dụng nên sử dụng Typescript để phát triển như Ionic 2.0 hay Angular 2.0,…
Hỗ trợ được các tính năng của JavaScript bản mới nhất
Nó đảm bảo việc sử dụng được đầy đủ các kỹ thuật mới nhất của JavaScript như các version hiện tại ES6 ( 2015)
Mã nguồn mở
Bạn có thể hoàn toàn có thể sử dụng nó mà không cần phải mất chi phí gì mà hơn nữa công động hỗ trợ Typescript vô cùng lớn và mạnh mẽ
Khả năng tương thích tốt với JavaScript
Nó là một trình biên dịch giúp tạo ra được các mã JavaScript, do đó bạn có thể chạy được ở bất kỳ đâu miễn là trình biên dịch hỗ trợ các JavaScript và bạn còn có thể trộn lẫn được các cú pháp của Javascript trong Typescript nó tạo điều kiện giúp các lập trình viên có thể tiếp cận đến với Typescript một cách nhanh chóng và dễ dàng hơn
Chức năng của TypeScript là gì?
Static Typing
Trong TypeScript, một trong những tính năng không thể phủ nhận là khả năng hỗ trợ ‘static typing’. Điều này có nghĩa là bạn có thể mô tả kiểu dữ liệu của biến và trình biên dịch sẽ tự động giảm nguy cơ phát sinh lỗi kiểu dữ liệu không đúng trong quá trình chạy. Đối với những biến mà bạn đã khai báo kiểu, TypeScript sẽ giúp bạn tránh được những lỗi không mong muốn. Một điểm đặc biệt là nếu bạn quên khai báo kiểu, TypeScript sẽ tự động phát hiện và đề xuất giải pháp từ mã nguồn của bạn. Điều này thực sự là một lợi ích quan trọng trong quá trình phát triển.
var burger: string = 'Spaghetti', // String calories: number = 400, // Numeric tasty: boolean = true; // Boolean // Alternatively, you can omit the type declaration: // var pasta = 'Spaghetti'; // The function expects a string and an integer. // It doesn't return anything so the type of the function itself is void. function speak(food: string, energy: number): void { console.log("Our " + food + " has " + energy + " calories."); } speak(pasta, calories);
Nếu TypeScript biên dịch thành công và chuyển đổi thành JavaScript, tất cả các thông tin về khai báo kiểu sẽ bị loại bỏ một cách triệt hạ, như một cách để giảm bớt trọng lượng của mã nguồn kết quả.
// JavaScript code from the above TS example. var burger = 'Spaghetti', calories = 400, tasty = true; function speak(food, energy) { console.log("Our " + food + " has " + energy + " calories."); } speak(Spaghetti, calories);
Các kiểu dữ liệu được sử dụng phổ biến nhất:
- Any – Một biến với kiểu này có thể nhận giá trị là một chuỗi, số hoặc bất kỳ kiểu dữ liệu nào khác.
- String – Tương tự như chuỗi trong JavaScript, có thể được bao quanh bởi ‘dấu nháy đơn’ hoặc “dấu nháy kép”.
- Number – Tất cả các giá trị số trong hàm được biểu diễn bởi kiểu number, không có phân biệt giữa số nguyên (integer) và số thực (float) cũng như các kiểu khác.
- Boolean – true hoặc false, sử dụng 0 và 1 sẽ gây ra lỗi biên dịch.
- Arrays – Có thể sử dụng 2 cú pháp: my_arr: number[]; hoặc my_arr: Array<number>.
- Void – Sử dụng khi hàm không trả về giá trị nào. Để khám phá toàn bộ danh sách các kiểu biến, bạn có thể tham khảo tài liệu hướng dẫn của TypeScript tại [đường link].
Interfaces
Interfaces đóng vai trò quan trọng trong việc kiểm tra tính phù hợp của một đối tượng với một cấu trúc nhất định, hỗ trợ trong quá trình phát triển.
Bằng cách xác định một interface, chúng ta có thể đặt tên cho sự kết hợp đặc biệt của các biến, đảm bảo rằng chúng luôn đi kèm với nhau trong mọi tình huống.
// Here we define our Food interface, its properties, and their types. interface Food { name: string; calories: number; } // We tell our function to expect an object that fulfills the Food interface. // This way we know that the properties we need will always be available. function speak(food: Food): void{ console.log("Our " + food.name + " has " + food.calories + " calories."); } // We define an object that has all of the properties the Food interface expects. // Notice that types will be inferred automatically. var ice_cream = { name: "cookies", calories: 250 } speak();
Hơn nữa, điều quan trọng cần nhớ là thứ tự của các thuộc tính không có tác động lớn bằng việc đảm bảo rằng chúng ta đã điền đầy đủ số lượng thuộc tính và chúng có đúng kiểu tương ứng. Trong trường hợp thiếu sót một thuộc tính nào đó, hoặc có sự không khớp về kiểu hoặc tên, trình biên dịch sẽ thông báo cảnh báo để chúng ta có thể sửa lỗi một cách chính xác.
interface Food { name: string; calories: number; } function speak(food: Food): void{ console.log("Our " + food.name + " has " + food.calories + " grams."); } // We've made a deliberate mistake and name is misspelled as nmae. var cookies = { nmae: "cookies", calories: 250 } speak(cookies);
Classes
Trong những dự án và ứng dụng lớn, lập trình hướng đối tượng thường là sự lựa chọn ưa thích của các nhà phát triển, đặc biệt là khi làm việc với các ngôn ngữ như Java hoặc C#.
TypeScript mang đến một hệ thống class mạnh mẽ, khá tương đồng với những ngôn ngữ này, bao gồm các chức năng như kế thừa, abstract classes, implementation của interfaces, setter/getters, và nhiều tính năng khác.
Mặc dù từ phiên bản ECMAScript 2015 trở đi, JavaScript đã tích hợp chức năng classes mà không cần TypeScript, nhưng sự khác biệt vẫn tồn tại. Cả hai phiên bản có nhiều tính năng tương tự, nhưng TypeScript tiếp tục mang lại sự nghiêm túc và chặt chẽ hơn trong quá trình phát triển.
Ví dụ:
class Menu { // Our properties: // By default they are public, but can also be private or protected. items: Array<string>; // The items in the menu, an array of strings. pages: number; // How many pages will the menu be, a number. // A straightforward constructor. constructor(item_list: Array<string>, total_pages: number) { // The this keyword is mandatory. this.items = item_list; this.pages = total_pages; } // Methods list(): void { console.log("Our special meal today is:"); for(var i=0; i<this.items.length; i++) { console.log(this.items[i]); } } } // Create a new instance of the Menu class. var sundayMenu = new Menu(["Banana cakes","waffles","Lemon juice"], 1); // Call the list method. sundayMenu.list();
Modules
Tính module hóa đóng một vai trò quan trọng khi triển khai các dự án lớn, giúp phân chia mã nguồn thành các thành phần nhỏ hơn và tăng khả năng tái sử dụng. Điều này giúp dự án trở nên có tổ chức hơn và dễ hiểu hơn, thay vì chỉ là một tập tin mã nguồn với hàng ngàn dòng code.
Trong TypeScript, bạn có khả năng sử dụng chức năng exporting và importing để quản lý modules, tuy nhiên, TypeScript không xử lý trực tiếp quá trình liên kết giữa các tệp tin. Đối với ứng dụng client, bạn có thể sử dụng require.js, còn với Node.js, CommonJS là lựa chọn phổ biến để cho phép các modules TypeScript sử dụng các thư viện bên thứ ba.
Hãy tưởng tượng một trường hợp có 2 tệp tin: một tệp tin xuất một hàm và một tệp tin nhập, chúng ta có thể đặt tên nó là:
exporter.ts
var sayHi = function(): void { console.log("Hello!"); } export = sayHi;
importer.ts
import sayHi = require(‘./exporter’); sayHi();
Để đạt được mục tiêu, trước hết, bạn cần tải xuống require.js và tích hợp nó bằng cách thêm vào một thẻ script – thông tin chi tiết có thể được xem trong hướng dẫn tại requirejs.org. Tiếp theo, hãy biên dịch cả hai tệp .ts. Để thông báo cho TypeScript rằng chúng ta đang tạo modules cho require.js (còn được biết đến là AMD), bạn cần thêm một tham số mở rộng nhất định, như sau:
Generics
Generics giúp một hàm có khả năng chấp nhận các tham số với nhiều kiểu khác nhau, làm cho nó trở nên linh hoạt hơn. Sử dụng generics để tạo các thành phần có thể tái sử dụng là một lựa chọn tốt hơn so với việc sử dụng kiểu any, vì generics giữ nguyên kiểu dữ liệu của biến đầu vào và biến đầu ra.
Ví dụ, trong đoạn mã dưới đây, Generics được áp dụng để hàm nhận một tham số và trả về một mảng chứa các giá trị cùng kiểu với tham số đó:
// The <T> after the function name symbolizes that it's a generic function. // When we call the function, every instance of T will be replaced with the actual provided type. // Receives one argument of type T, // Returns an array of type T. function genericFunc<T>(argument: T): T[] { var arrayOfT: T[] = []; // Create empty array of type T. arrayOfT.push(argument); // Push, now arrayOfT = [argument]. return arrayOfT; } var arrayFromString = genericFunc<string>("beep"); console.log(arrayFromString[0]); // "beep" console.log(typeof arrayFromString[0]) // String var arrayFromNumber = genericFunc(42); console.log(arrayFromNumber[0]); // 42 console.log(typeof arrayFromNumber[0]) // number
Khi chúng ta gọi hàm lần đầu, chúng ta xác định kiểu của tham số là string. Tuy nhiên, điều này không hoàn toàn bắt buộc vì trình biên dịch có khả năng tự động nhận diện kiểu dữ liệu phù hợp nhất từ tham số được truyền, giống như lần gọi hàm thứ hai.
Mặc dù không là điều bắt buộc, nhưng luôn luôn cung cấp kiểu dữ liệu được xác định được xem là cần thiết, đặc biệt trong các tình huống phức tạp, vì trình biên dịch có thể hiểu lầm kiểu dữ liệu trong những trường hợp phức tạp hơn.
Ưu, nhược điểm của Typescript
Ưu điểm
Typescript thuận tiện sử dụng và hoàn toàn miễn phí :Typescript hỗ trợ bạn tìm kiếm giúp tiết kiệm được thời gian kiểm tra lại code mà không cần thông qua bất kỳ ai để tìm không tin dữ liệu
Thao tác đơn giản và nhanh chóng : Typescript có thao tác đơn giản và tiết kiệm thời gian và có những kết quả tốt đến bất ngờ phục và nó khắc phục được các tình trạng xuất hiện các lỗi và dễ dàng đọc hơn so với các ngôn ngữ khác.
Static typing: TypeScript đi kèm với kiểu gõ tĩnh tùy chọn và hệ thống suy luận kiểu, có nghĩa là một biến, được khai báo không có kiểu, có thể được TypeScript suy ra dựa trên giá trị của nó.
Tái cấu trúc dễ dàng: Khi bạn lập trình, bạn sẽ thường xuyên phải chỉnh sửa lại nhiều thứ và bạn muốn chỉnh sửa nhưng có quá nhiều tệp và khiến bạn ngại thay đổi chúng. Nhưng khi bạn sử dụng ngôn ngữ lập trình TypeScript bạn chỉ cần cấu trúc chỉ cần một cú nhấp chuột lệnh Rename Symbol biểu tượng IDE giúp bạn thấy tất cả những lần xuất hiện chức năng, lớp và thuộc tính đã cho của giao diện đối tượng trong các ứng dụng
Gặp ít lỗi hơn : Nó hỗ trợ và giúp việc viết tất cả các mã hợp lệ dễ dàng hơn nhiều, giúp bạn tiết kiệm được khoảng 50% thời gian chỉnh sửa bằng các cảnh báo lỗi ngay lập tức khi bạn đang lập trình viết code, sử dụng giá trị Null hay các chuyển đối tượng vào nơi mà nó phải là mảng thay thế.
Các thử nghiệm Boilerplate ít hơn: Khi bạn chắc chắn vào việc truyền chính các vị trí nhất định, bạn cần phải kiểm tra tất cả các biến đó thay vì phải viết các kiểm tra đơn vị hay tích hợp đơn giản và bạn có thể tập trung vào các kiểm thử logic nghiệp vụ của ứng dụng. Do đó việc thử nghiệm ít hơn, dẫn đến thời gian ngắn hơn để phát triển những tính năng mới do đó nó ít phức tạp hơn, ít lỗi hơn và dễ dàng bảo trì hơn.
Kiểm tra thời gian biên dịch: JavaScript là ngôn ngữ lập trình được thông dịch. Không có biên dịch liên quan. Do đó, các lỗi bị phát hiện trong thời gian chạy. Vì TypeScript biên dịch thành JavaScript, các lỗi được báo cáo trong thời gian biên dịch thay vì thời gian chạy.
Hỗ trợ trình chỉnh sửa code: IDE hoặc trình chỉnh sửa mã như VS Code hỗ trợ tự động hoàn tất cho cơ sở mã TypeScript. Cung cấp tài liệu nội tuyến và làm nổi bật các lỗi.
Hợp nhất các mã đơn giản: Sau khi code và chạy thử nghiệm, có thể ngay trong môi trường đều hoạt động một cách trơn tru các đoạn code đó sẽ hoạt động tốt trong môi trường có điều kiện khác. Do đó TypeScript giúp bạn có thể hợp nhất các mã đơn giản và có thể đánh giá đoạn mã của bạn bằng trình biên dịch giúp người sử dụng có thể tiết kiệm thời gian và công sức vào nó
Hỗ trợ OOP mạnh mẽ : Sử dụng các cú pháp hướng đối tượng được hỗ trợ bởi Typescript như việc đóng gói, kế thừa, constructor, interface, implement, override, abstract,…
Nhược điểm
Phải sử dụng trình biên dịch: Để có thể chạy được TypeScript với đuối .JS trên nền tảng NodeJS bạn bắt buộc phải sử dụng trình biên dịch thì mới có thể sử dụng được .
Các bước thiết lập khá cồng kềnh: Các bước thiết lập cồng kềnh: Trước khi sử dụng được TypeScript cần phải đảm bảo được rằng máy tính bạn cần phải cài đặt phần mềm Node.JS và tất cả các chương trình thử nghiệm hay các webpack đều có thể hoạt động với TypeScript nếu không bạn sẽ không thể sử dụng được nó
Đây là một phần ngôn ngữ dùng để hỗ trợ: Các Chức năng TypeScript chỉ dùng để biên dịch cho phần mềm JavaScript, nó không phải là một ngôn ngữ lập trình có thể vận hành độc lập, riêng lẻ và đồng thời nó không thể nào thay thế vai trò cho JavaScript. TypeScript chỉ được nâng cấp từ các nhược điểm của JavaScript. Với TypeScript thì bạn không thể hoàn thiện được các công đoạn của một dự án, nó chỉ nổi bật khi được kết hợp nhuần nhuyễn và tối ưu với các ngôn ngữ hay các tool khác
Sự khác biệt giữa Typescript và Javascript
Tại sao Typescript được phát triển trong khi đã có Javascript?
Javascript là một ngôn ngữ lập trình phía máy khách. Nhưng khi mọi người sử dụng JS, các nhà phát triển cũng nhận ra rằng JS cũng có thể được sử dụng làm ngôn ngữ phía máy chủ. Tuy nhiên, khi Javascript ngày càng phát triển, code trở nên phức tạp. Do đó, JS đã không thể đáp ứng yêu cầu của ngôn ngữ lập trình hướng đối tượng. Điều này đã cản trở Javascript thành công ở cấp độ doanh nghiệp như một công nghệ phía máy chủ. Vì vậy, Typescript được tạo ra để thu hẹp khoảng cách này.
Các tính năng của Typescript
- Code TypeScript được chuyển đổi thành code JavaScript thuần túy: Trình duyệt không thể diễn giải code Typescript một cách tự nhiên. Vì vậy, nếu code được viết bằng Typescript, nó sẽ được biên dịch và chuyển đổi thành Javascript. Quá trình này được gọi là Trans-piled. Với sự trợ giúp của code Javascript, các trình duyệt có thể đọc và hiển thị nó.
- JavaScript là TypeScript : Bất kỳ code nào được viết bằng JavaScript đều có thể được chuyển đổi thành TypeScript bằng cách thay đổi phần mở rộng từ .js thành .ts .
- Sử dụng TypeScript ở mọi nơi: TypeScript có thể được biên dịch để chạy trên mọi trình duyệt, thiết bị hoặc hệ điều hành. TypeScript không dành riêng cho bất kỳ môi trường nào.
- TypeScript hỗ trợ các thư viện JS: Với TypeScript, các nhà phát triển có thể sử dụng code JavaScript hiện có, kết hợp các thư viện JavaScript phổ biến hoặc gọi code TS từ code JavaScript gốc.
Sự khác biệt giữa TypeScript và JavaScript
- TypeScript được biết đến như một ngôn ngữ lập trình hướng đối tượng trong khi JavaScript là ngôn ngữ dựa trên nguyên mẫu.
- TypeScript có một tính năng được gọi là Static typing nhưng JavaScript không hỗ trợ tính năng này.
- TypeScript hỗ trợ giao diện nhưng JavaScript thì không.
Ưu điểm của việc sử dụng TypeScript so với JavaScript
- TypeScript luôn chỉ ra các lỗi biên dịch tại thời điểm phát triển (tiền biên dịch). Do đó, ít có khả năng xảy ra lỗi thời gian chạy hơn, trong khi JavaScript là ngôn ngữ được thông dịch.
- TypeScript hỗ trợ gõ tĩnh/mạnh. Điều này có nghĩa là tính chính xác của kiểu có thể được kiểm tra tại thời điểm biên dịch. Tính năng này không có sẵn trong JavaScript.
- TypeScript không là gì ngoài JavaScript và một số tính năng bổ sung, tức là các tính năng của ES6. Nó có thể không được hỗ trợ trong trình duyệt mục tiêu của bạn nhưng trình biên dịch TypeScript cũng có thể biên dịch các tệp .ts thành ES3, ES4 và ES5.
Hi vọng với những thông tin mà chúng tôi cung cấp ở trên bạn đã phần nào hiểu được Typescript là gì và những lý do nên sử dụng Typescript. Nếu có bất kỳ thắc mắc nào, đừng ngần ngại để lại bình luận bên dưới bài viết, Tester sẽ nhanh chóng giải đáp nhé!
Đọc thêm: Sự khác nhau giữa hai ngôn ngữ lập trình Java và Javascript