TypeScript基本類型檢查

基本類型約束

TS是一個可選的靜態的類型系統javascript

如何進行類型約束

  • 約束對象: 變量、函數的參數、函數的返回值
let aaa:string = 'hello';
function sum(a:number, b:number):number {
    return a + b;
}
let nums:number[] = [1, 2, 3];
let num:number = sum(3, 4); // 第一種
let numss: Array<number> = [1, 2, 3]; // 第二種
複製代碼

==由於TS有嚴格的類型檢查,在對函數重命名的時候,可使用F2來全局替換。==java

快捷鍵F12:轉到定義typescript

TS在不少場景中推導出數據類型json

any: 表示任意類型,對該類型,ts不進行類型檢查數組

小技巧:如何區分數字字符串和數字,關鍵看怎麼讀?bash

若是按照數字的方式讀,就是數字。函數

源代碼和編譯結果的差別

編譯結果中沒有類型約束信息ui

基本類型

  • number: 數字
  • string: 字符串
  • boolean: 布爾值
  • array
  • object
  • null和undfined

null和undefined是全部其餘類型的子類型,他們能夠賦值給其餘類型spa

經過在tsconfig.json中的compilerOptions添加strictNullChecks: true, 能夠得到更加嚴格的空類型檢查,以後null和undfined只能賦值給自身。code

其餘的經常使用類型

  • 聯合類(配合類型保護進行判斷)

類型保護: 當對某個變量進行類型判斷以後,在判斷語句塊中即可以肯定它的確切類型,typeof能夠觸發類型保護。

let name: string | undefined;
if(typeof name === "string") {
    // 類型保護
    name.
}
複製代碼
  • void類型(一般用於約束函數的返回值,表示函數不返回任何東西)
function printMenu():void {
    console.log("no return");
}
複製代碼
  • never類型(一般用於約束函數的返回值,表示函數永遠不會結束)
function throwError(msg: string):never {
    throw new Error(msg);
    console.log("dsafasdf"); // 此處爲沒法運行到的代碼
}

function alwaysDoSomething():never {
    while() {
        // ...
    }
}
複製代碼
  • 字面量類型(使用一個值進行約束)
let gender: "男"| "女"; //表示gender永遠只能爲男或者女
let a:"A"; // a永遠只能爲A
let b:1;
let user: {
    name: string,
    age: number
};// user必需要有name,age
複製代碼
  • 元祖類型(Tuple): 一個固定長度的數組,而且數組中的每一項的類型肯定
let tu:[string, number];

tu = ["d", 2];
複製代碼
  • any類型(能夠繞過類型檢查,所以,any類型的數據能夠賦值給任意類型)
let data:any = 123;
let bb: number = data
複製代碼

類型別名:對已知的一些類型定義名稱

// 防止重複的書寫代碼
type Gender = "男" | "女"
type User = {
    name:string,
    age:number,
    gender: Gender
}
let u:User

u = {
    name: "www",
    age: 18,
    gender: "男"
}
function getUsers(g:Gender):User[] {
    return [];
}
複製代碼

函數的相關約束

函數重載:

/** * 獲得a*b的結果 * @param a * @param b */
function combine(a:number, b:number):number;
/** * 獲得a和b拼接的結果 * @param a * @param b */
function combine(a:string, b:string):string;
function combine(a: number | string, b: number | string): number | string {
    if(typeof a === "string" && typeof  b === "string") {
        return a + b;
    }else if(typeof a === "number" && typeof b === "number") {
        return a * b;
    }
    throw new Error("a和b必須是相同的類型");
}

const result = combine(1,2); // 自動監測出返回值爲number
複製代碼

可選參數:能夠在某些參數後面加上問號,表示這些參數能夠不用傳遞

function sum(a: number, b:number, c?:number):number { //可選參數必須是在參數列表的後面
    // 當c沒有傳值是爲undefined
    if(c) {
        return a + b + c;
    }
    return a + b;
}
複製代碼

實例-建立打印撲克牌

在開發的過程當中有智能提示,減小代碼的錯誤,提高代碼開發效率

type Deck = NormalCard[]
type Color = "♥" | "♠" | "♦" | "♣"
type NormalCard = {
    color: Color
    mark: number
}
function createdDeck(): Deck {
    const deck: Deck = [];
    for (let i = 1; i < 13; i++) {
        deck.push({
            mark: i,
            color: "♠"
        });
        deck.push({
            mark: i,
            color: "♣"
        });
        deck.push({
            mark: i,
            color: "♥"
        });
        deck.push({
            mark: i,
            color: "♦"
        })
    }
    return deck;
}

function printDeck(deck: Deck): void {
    let result = "\n";
    deck.forEach((card, index) => {
        let str = card.color;
        if (card.mark <= 10) {
            str += card.mark;
        }
        else if (card.mark == 11) {
            str += "J";
        }
        else if (card.mark == 12) {
            str += "Q";
        }
        else if (card.mark == 12) {
            str += "K";
        }
        result += str + "\t";
        if(((index + 1) % 4) == 0) {
            result += "\n";
        }
    })
    console.log(result);
}

const deck = createdDeck();
printDeck(deck);
複製代碼
相關文章
相關標籤/搜索