typescript基礎——數據類型和類型斷言

typescript是一種給javascript添加特性的語言擴展。
擴展功能包括:

  • 類型批註和編譯時類型檢查
  • 類型推斷
  • 類型擦除
  • 接口
  • 枚舉
  • Mixin
  • 泛型編程
  • 名字空間
  • 元組
  • Await

變量聲明

let [變量名]: [數據類型] = 值

數據類型

  1. any 任意類型
    聲明爲any的變量可以賦予任意類型的值

不明確變量類型時使用;
改寫現有代碼時,在編譯時選擇性的包含或者移除類型檢查
定義存儲各種類型數據的數組 let arr: any[] = [12, ‘s’, false, {a: 1}];

  1. number 數據類型
    雙精度64位浮點值,用來表示整數或者分數
  2. string 字符串
  3. boolean 布爾類型
  4. 數組類型
    兩種聲明方式
  • let list: number[] = [1,2] 元素類型+[]
  • let list: Array<number> = [1,2] Array<數據類型>
  1. 元組類型
    元組類型用來表示已知元素數量和類型的數組,對應位置的元素類型要與聲明的位置相同
let x: [string, number];
x = ['string', 12] // correct
x = [12, 'str'] // incorrect
  1. 枚舉類型
    用於定義數值集合
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
  1. 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[]) {}

  1. null
  2. undefined
  3. 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

類的相關概念

  1. 類: 定義了一件事物的抽象熱點,包含它的屬性和方法
  2. 對象: 類的實例, 通過new 生成
  3. 面向對象的三大特性: 封裝, 繼承, 多態
  4. 封裝: 把對數據操作的細節隱藏起來,自暴露對外的接口,外界不需要知道具體實現細節,同時也保證了外界無法隨意更改對象內部的數據
  5. 繼承: 子類繼承父類,之類除了擁有父類的所有特性外,還有一些更加具體的特性
  6. 多態: 繼承產生的相關的不同類,對同一個方法有不同的響應,(對從父類繼承來的方法有自己獨特的實現定義)
  7. 存取器: 改變屬性的讀取和賦值行爲(getter & setter)
  8. 修飾器: 修飾符是一些關鍵字,用於限定成員或類型的性質,比如public表示公有屬性或方法;
  9. 抽象類: 抽象類是提供其他類繼承的基類,抽象類不允許被實例化;抽象類中的抽象方法必需在子類中實現
  10. 接口: 不同類之間公有的屬性或方法,可以抽象成一個接口,接口可是被類實現,一個類只能繼承自另一個類,但是可以實現多個接口;

類包含三個部分: 字段, 構造函數, 方法

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


類型斷言

可以用來手動指定一個值的類型
類型斷言只能避免編譯階段進行類型檢測,無法避免運行時的錯誤

語法

  1. 值 as 類型
  2. <類型>值

在tsx中只能用第一個寫法 “值 as 類型”

用途

  1. 將一個聯合類型斷言爲其中一個類型。因爲當不確定到底是哪個類型的時候,只能訪問他們共有的屬性和方法。
  2. 將一個父類斷言爲一個更加具體的子類
  3. 將任何一個類型斷言爲any
  4. 將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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章