typescript是一種給javascript添加特性的語言擴展。
擴展功能包括:
- 類型批註和編譯時類型檢查
- 類型推斷
- 類型擦除
- 接口
- 枚舉
- Mixin
- 泛型編程
- 名字空間
- 元組
- Await
變量聲明
let [變量名]: [數據類型] = 值
數據類型
- any 任意類型
聲明爲any的變量可以賦予任意類型的值
不明確變量類型時使用;
改寫現有代碼時,在編譯時選擇性的包含或者移除類型檢查
定義存儲各種類型數據的數組 let arr: any[] = [12, ‘s’, false, {a: 1}];
- number 數據類型
雙精度64位浮點值,用來表示整數或者分數 - string 字符串
- boolean 布爾類型
- 數組類型
兩種聲明方式
let list: number[] = [1,2]
元素類型+[]let list: Array<number> = [1,2]
Array<數據類型>
- 元組類型
元組類型用來表示已知元素數量和類型的數組,對應位置的元素類型要與聲明的位置相同
let x: [string, number];
x = ['string', 12] // correct
x = [12, 'str'] // incorrect
- 枚舉類型
用於定義數值集合
enum Color {Red, Green, Blue}; // Red對應的值是0, 往後依次加一。相當於{Red: 0, Green: 1, Blue: 2}
let c: Color = Color.Red;
console.log(c) // 0
// 可以指定值
enum Color {Red = 2, Green, Blue}
// 如果某個屬性值是計算出來的,那麼它後面緊跟的屬性必須初始化
const getValue() {return 0}
enum List {
A = getValue(),
B = 3,
C
}// B必須初始化,後面的值按照默認規則,依次加一, 所以C是4
- void
標識方法返回值的類型, 表示該方法沒有返回值
如果給一個變量定義爲void類型,這個值只能是undefined或者null
帶參數的函數
function add(param1: string, params: number) {}
可選參數(可選參數只能出現在後面)
function add(param1: number, param2?: number) {}
默認值
function add (param1: number, param2: number = 3) {}
剩餘參數(利用es6的展開運算符)
function add(param1: number, …param2: number[]) {}
function add(…param: number[]) {}
- null
- undefined
- never 從來不會出現的值
類型推斷
如果沒有給出類型,ts編譯器會根據值的類型來推斷;如果推斷不出來就默認是any類型
let num = 'string' // 此時編譯器推斷出num是string類型
num = 12 // 此時再賦值, 因爲值的類型不是string所以會報錯
聯合類型
let val: string | number = 12; // val 可以是字符串或者數字類型
// 聯合類型數組
let arr:number[] | string[] = [1,2,4] // arr可以是字符串數組或者數字數組
枚舉
- 枚舉值和枚舉名可以反向映射;
- 枚舉名不能是數字,數字字符串也不行;
- 枚舉值默認從0 開始依次加一;
- 枚舉值可以手動指定,默認是隻能指定常數表達式(數字,或一元, 二元運算都是常數表達式);
- 指定字符串時候可以使用類型斷言來避免類型檢測;
- 當枚舉值是個計算值時,緊跟其後的枚舉值必需指定默認值,不然ts無法計算;
enum fundTypeEnum {
'全部賬戶' = <any>'a',
'賬期' = 1,
'虛擬賬戶' = 2,
'信用金' = 3,
'現金賬戶' = 4,
};
接口
接口是一系列抽象方法的聲明,是一些方法特徵的集合。
這些方法都應該是抽象的,需要具體的類實現,然後第三方就可以通過這組抽象方法調用,讓具體的類執行具體的方法。
interface IPerson {
firstName: string,
lastName: string,
sayHi: () => string,
func?: () => void
}
接口繼承可以用extends
類
類的相關概念
- 類: 定義了一件事物的抽象熱點,包含它的屬性和方法
- 對象: 類的實例, 通過new 生成
- 面向對象的三大特性: 封裝, 繼承, 多態
- 封裝: 把對數據操作的細節隱藏起來,自暴露對外的接口,外界不需要知道具體實現細節,同時也保證了外界無法隨意更改對象內部的數據
- 繼承: 子類繼承父類,之類除了擁有父類的所有特性外,還有一些更加具體的特性
- 多態: 繼承產生的相關的不同類,對同一個方法有不同的響應,(對從父類繼承來的方法有自己獨特的實現定義)
- 存取器: 改變屬性的讀取和賦值行爲(getter & setter)
- 修飾器: 修飾符是一些關鍵字,用於限定成員或類型的性質,比如public表示公有屬性或方法;
- 抽象類: 抽象類是提供其他類繼承的基類,抽象類不允許被實例化;抽象類中的抽象方法必需在子類中實現
- 接口: 不同類之間公有的屬性或方法,可以抽象成一個接口,接口可是被類實現,一個類只能繼承自另一個類,但是可以實現多個接口;
類包含三個部分: 字段, 構造函數, 方法
class Car {
// 字段
engine:string;
// 靜態屬性
static name: string;
public age: number; // 屬性和方法是公有的,可以在任何地方被訪問到。默認所有的屬性和方法都是pubic
// 構造函數 , 通過new生成新實例時,會自動調用構造函數。
constructor(engine:string) {
this.engine = engine
}
// 私有方法,不能在聲明它的類外部訪問;不允許在子類中訪問
private setAge(): number {};
// 受保護的,可以在子類中訪問
protected func(): void {};
// 靜態方法 , 不需要實例化,直接通過類來調用
static disp():void {
console.log("發動機爲 : "+this.engine)
}
get engine () {}
set engine () {}
}
類實現接口可以用implements
類型斷言
可以用來手動指定一個值的類型
類型斷言只能避免編譯階段進行類型檢測,無法避免運行時的錯誤
語法
- 值 as 類型
- <類型>值
在tsx中只能用第一個寫法 “值 as 類型”
用途
- 將一個聯合類型斷言爲其中一個類型。因爲當不確定到底是哪個類型的時候,只能訪問他們共有的屬性和方法。
- 將一個父類斷言爲一個更加具體的子類
- 將任何一個類型斷言爲any
- 將any斷言爲任何一個具體的類型
限制
並不是任何一個類型都可以被斷言爲任何另一個類型
A兼容B, 那麼A能夠被斷言爲B, B也能被斷言爲A
interface Animal {
name: string;
}
// ts是結構類型系統,類型之間的對比只會比較他們最終的結構
// interface Cat extends Animal {
// run(): void;
// }
interface Cat {
name: string;
run(): void;
}
let tom: Cat = {
name: 'tom',
run: () => {}
}
// Animal 兼容 Cat, 他們之間可以相互斷言
let animal: Animal = tom;