TypeScript實戰-01-TypeScript簡介

一,前言

JS的發展:

隨着互聯網的發展,JavaScript被廣泛應用
目前JavaScript不僅侷限於網站開發,還可以進行APP,服務端,桌面應用等多端應用開發
JavaScript還被廣泛應用於IOT,AI,大數據等諸多新興領域

無處不在的JS已經成爲了不折不扣的全棧開發語言,也賦予了前端開發者更多的機會和挑戰
JS野蠻生長的同時也暴露出自身的很多問題,對語言的安全性,健壯性和可維護性提出了更高的要求

JS的問題:

JS作爲一門動態弱類型語言,對變量類型非常寬容,使得語言具有極大"靈活性",同時這也是JS的一種"缺陷"

1)JS不會像Java這種靜態強類型語言一樣可以在編譯階段執行靜態代碼檢測,很多問題只能在執行時才能被發現
如:	TypeError: "xxx" is not a function; 
	TypeError: Cannot read property "length" of undefined; 
2)爲了保證代碼的健壯性,需要對輸入參數進行各種假設和校驗
3)對於底層代碼中參數類型的改動,不能確定對引用處的影響
4)字段類型問題引起的接口API的調用報錯
5)變量或方法與調用者之間不能通過類型約束建立結構化契約,導致調用異常時常發生

在程序猿的世界中,隱約存在一條"語言鄙視鏈",而JS的這種"缺陷"使得它長久以來處於被"鄙視"的那一端
前端開發者在長期沒有類型約束的環境下進行開發,造成了類型思維缺失,成爲前端開發者的短板
這就是爲什麼Java轉JavaScript很簡單,而JavaScript轉Java卻很困難

解決方案-TypeScript:

開源社區也一直在努力解決這個問題
2014年FaceBook推出了Flow,同年微軟也發佈了TypeScript
兩者都致力於爲JavaScript提供靜態類型檢查功能

目前TypeScript更勝一籌
Angular和Vue也正在全面使用TypeScript進行代碼重構
甚至FaceBook自家的產品也在從Flow向TypeScript進行遷移
在ES標準推出靜態類型檢查之前,TypeScript是目前解決此問題的最佳方案

學習TypeScript的必要性:

如果在一年前,可能TypeScript還不是剛需
但按目前的趨勢看,不管是對於JS語言本身還是開發者類型思維的塑造,TypeScript已經是開發者的必備技能
ES6,TypeScript等也都是面試中經常會被問到的點

二,TypeScript是什麼

TypeScript並不是一門獨立的新語言,它是擁有類型系統的JavaScript的超集
TypeScript可編譯成純JavaScript,提供了類型檢查,語言擴展,工具屬性等特性
TypeScript編譯器會先掃描源代碼,把它轉換抽象語法樹,然後再轉換成JavaScript

三,爲什麼要使用TypeScript

1,類型檢查
TypeScript在代碼編譯時會進行嚴格的靜態類型檢查
這意味着能夠在編碼階段發現可能存在的隱患,從而降低將它們帶到線上可能
2,語言擴展
TypeScript包括ES6和未來體驗中的特性,如: 異步操作和裝飾器
也會從其他語言借鑑某些特性,如接口和抽象類
3,工具屬性
TypeScript可以編譯成標準的JavaScript,可以在任何瀏覽器,操作系統上運行,無需任何運行時的額外開銷
從這個角度上講,TypeScript更像是一個工具,而不是一門獨立的語言
4,VSCode支持
VSCode具有強大的自動補全,導航和重構功能,同時提供了TS相關插件:如TypeScript Extension Pack
使接口定義可以直接代替文檔,同時可以提高開發效率,降低維護成本
5,幫助團隊重塑”類型思維”
擁有類型檢查能力的TypeScript,可以幫助團隊重塑”類型思維”,使開發者從代碼的編寫者蛻變爲代碼的設計者

四,強類型與弱類型

JS是動態弱類型語言,與之對應的還有靜態類型語言和強類型語言
1.強類型 :
調用函數與被調用函數的參數相同 (廣義)
強類型語言,不允許改變變量的數據類型,除非進行強制類型轉換

以Java爲例:

class Test {
	public static void main(String[] args) {
		int x = 1;
		boolean y = true
		x = y;
		System.out.println(x);
	}
}
定義變量x爲int類型,y爲boolean類型,
將y賦值給x會發生類型不兼容,不能將boolean型轉換爲整形
class Test {
	public static void main(String[] args) {
		int x = 1;
		boolean y = true;
		//x = y;
		char z = 'a';	// 字符a的十進制97
		x = z;
		System.out.println(x);
	}
}
將char類型的變量z賦值給x,輸入97沒有報錯
因爲java進行了強制類型轉換,將字符a的ascii碼賦值給了x
2.弱類型
弱類型語言中,變量可以被賦值不同的數據類型,變量定義後仍然可以改變其類型
JavaScript就是一門弱類型語言

以JavaScript爲例:

>   let x = 1;
	let y = true;
	x = y;
<   true
整型x和boolean型y,可以將y賦值給x
>   let z = 'a';
	x = z
<   "a"

可以直接賦值,不會進行強制類型轉換


總結:

強類型語言
	對變量類型的轉換有嚴格的限制,不同類型的變量是不能相互賦值的,這樣可以避免很多低級的錯誤
弱類型語言
	沒有什麼約束,雖然相對靈活,但也更容易產生bug

五,動態類型與靜態類型

靜態類型語言:

在編譯階段確定所有變量的類型

動態類型語言:

在執行階段確定所有變量的類型

動態類型語言則會把這項工作推遲到程序的執行階段

js示例:

class C {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
}

function add(a, b) {
    return a.x + a.y + b.x + b.y;
}
定義了一個類C,爲它添加兩個實例成員x和y,
定義了一個add函數,作用是將兩個實例的所有屬性相加
當js編譯器看到這段代碼時,完全不能獲知變量類型,
只有在程序執行時,才能根據實際傳進來的變量來確定

如果是強類型語言,如Java,在編譯階段就可以知道變量的類型一定是整形
總結

靜態類型語言:

對類型有較嚴格的要去,能夠理解發現代碼中的錯誤,運行時性能較好,可以實現自文檔化

動態類型語言:

對類型要求比較寬鬆,遺留下的bug可能會隱藏很久很久纔會被發現,運行時性能較差,可讀性性能較差

六,TypeScript的示例和編譯

使用TS對變量類型的約束:

const message: string = 'hello world';
console.log(message);

編譯成JS:

"use strict";
const message = 'hello world';
console.log(message);
查看TS編譯爲JS的效果 : http://www.typescriptlang.org/play/index.html

七,結尾

簡單介紹了JS的發展和存在的問題,
TS的誕生和使用TS所能帶來的優勢
以及JS作爲動態弱類型語言存在的問題,及TS對JS的增強
還通過網站查看了TS編譯成JS的形式

維護日誌:

20190905:
編寫文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章