TypeScript

之前很早就聽說過TypeScript,也看過好幾遍文檔。但是如果不在實際項目中使用,總是沒有實感,看完就忘了。這次新公司的項目就是ts,寫的非常開心,確實感覺ts寫出來的代碼要穩固健壯的多,一切都很可控,非常舒服。

介紹

TypeScript(一下簡稱TS)是由微軟開發的語言,它是 JavaScript(以下簡稱JS)的超集,它可以編譯成純JS使用。衆所周知JS是動態語言,不指定變量類型,可以任意改變。TS就是爲JS增加了一套完整的類型和類型檢查系統,讓代碼更可讀可控,更健壯,輸入輸出都更清晰明瞭。

使用TS十分簡單,把JS的文件擴展名直接由.js改爲.ts即可。即使代碼中沒有顯示定義類型,也能夠自動做出類型推論。另外,TS最終是編譯成JS來執行的,編譯的過程中,TS會執行類型檢查,如果有錯誤會提示出來方便開發者修改,但是即便報錯,也仍然會編譯出JS供執行。

參考資料

推薦首先閱讀 TypeScript 入門教程 ,閱讀順序比較友好。

常見用法

安裝之類的就不說了,直接上代碼看用法。

原始數據類型

// 對於原始數據類型
const x: boolean = false; // boolean, 注意 new Boolean(0) 生成的對象不是布爾值
const x: number = 6; // 數字
const x: string = 'fsdf'; // 字符串
const x: undefined = undefined; // undefined
const x: null = null; // null

// js沒有空值 void 的改變,在ts中,可以用 void 表示沒有任何返回值的函數
function alertName(): void {
    alert('My name is Tom');
}

任意值

// 任意值 any, 不限定類型。但在實際開發中慎用,寫了相當於不是ts了
let x: any = 6;
x = 'fdsfs';

類型推論

// 如果沒有顯式指定類型,ts也會自行推論,然後報錯
let myFavoriteNumber = 'seven';
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.

聯合類型

// 聯合類型,允許某個值有多個可能的類型
let x: string | number;  // 只能是 string 或者 number,否則會報錯
x = 'seven';
x = 7;
// 這裏需要注意,當使用聯合類型時,我們只能訪問 所有類型 共有 的屬性或方法。
// 比如 x.toString()是兩者共有的,就沒問題
// 而 x.length 只有string有,number沒有,就會報錯。

對象的類型 – 接口 interface

TS中使用接口(interface)來定義對象的類型。簡單來說就是,它用來描述對象的 形狀。

一般來說,interface 使用 I + 大駝峯 來命名,方便區分。

// 比如
interface IPerson = {
	readonly id: number; // 只在 對象被創建 的時候被賦值,用readonly定義只讀屬性
	name: string; // 姓名,字符串類型
	age: number; // 年齡, 數字類型
	hasMoney?: boolean; // 是否有錢, 布爾值 可選參數
	childern?: IPerson[]; // 孩子, 對象數組,對象仍然是IPerson的形狀, 可選參數
	// 任意屬性,來設定 key 和 value 的類型
	// 但因爲上邊已經有 number string boolean IPerson[]這幾個類型
	// 所以這裏的任意屬性,起碼要包含上述這幾種類型,不然就自相矛盾了
	// 故這裏可以使用聯合類型
	[propName: string]: string | number | boolean | IPerson[]; 
	// 也可以直接使用any
	[propName: string]: any;
}

數組的類型

// 「類型 + 方括號」表示法
const x = string[]; // 字符串數組
// 泛型表示
const x: Array<number> = [1, 1, 2, 3, 5];
// 用 interface 表示
interface NumberArray {
    [index: number]: number;
}
let fibonacci: NumberArray = [1, 1, 2, 3, 5];
// any 數組
const list: any[] = ['Xcat Liu', 25, { website: 'http://xcatliu.com' }];

// 類數組: 相似但不是數組類型,常見的都有自己的接口定義,比如
IArguments
NodeList
HTMLCollection

函數的類型

// 括號內寫明每個參數的類型
// 括號外表示 返回值 的類型,沒有返回值則爲 void
function sum(x: number, y: number): number {
    return x + y;
}

// 帶 ? 問號 的是可選參數,可選參數 必須在 必選參數 的後面。
// ES6 中允許給參數默認值,TS會將添加了默認值的參數視爲可選參數
// 但此時,就不受 「可選參數得在必選參數後邊」 的限制了。
function sum(x: number, y: number = 0): number {
    return x + y;
}

類型斷言

todo…

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