最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

TypeScript類型斷言VS類型守衛(wèi)示例詳解

 更新時間:2022年11月14日 10:50:39   作者:何遇er  
這篇文章主要為大家介紹了TypeScript類型斷言VS類型守衛(wèi)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

類型斷言

類型斷言有兩種寫法,分別為value as Type<Type>value,它讓 TypeScript 編譯器將 value 當作 Type 類型。類型斷言是一個編譯時特性,不進行類型轉換,因此不會影響變量在運行時的數據類型。如果某變量是 any 類型,但現在你知道它確切的數據類型,使用類型斷言能讓 IDE 有代碼提示的能力,也能讓 TypeScript 編譯器進行類型檢查。

類型斷言的用法如下:

const age: any = 23.44;
const user: any = {age: 2}
// age 的 原始數據類型是 any ,在這里將它斷言為 number 類型
(age as number).toFixed(0);
(<number>age).toFixed(0);
// 將user斷言為非null和非undefined
user!.age

除非確切的知道變量的數據類型,否則不要使用類型斷言,這是因為類型斷言會讓 TypeScript 編譯器將變量當做指定的類型,而不管它實際的類型,在程序運行時可能有類型錯誤。

類型守衛(wèi)

類型守衛(wèi)的工作是將數據類型收窄,比如,變量 age 的數據類型可能是 string 也可能是 number,現在要將 age 收窄為 string 類型,類型守衛(wèi)能實現它??傮w而言,有4種方式讓數據類型收窄。

使用 in 關鍵字

如果某變量的數據類型是聯合類型,并且該變量存在一個屬性絕對不會出現在聯合類型的其他成員類型上,那么可以使用 in 關鍵字將類型收窄。用法如下:

function printType(value: User | Student) {
    // grade 只存在 Student 類型上
if ('grade' in value) { 
        // 在 if 塊中,value 的數據類型被收窄為 Student 類型
        console.log('它是 Student 類型',value.name + ':' + value.grade)
    } else {
	// 在 else 塊中,value 的數據類型被收窄為 User 類型
        console.log('它是 User 類型',value.name)
    }
}

使用 instanceof 關鍵字

用 in 關鍵字收窄數據類型有局限性,必須有一個獨特的屬性作為判別符,否則,不能用 in 關鍵字收窄。如果正在處理的變量是類的實例,那么可以用 instanceof 關鍵字收窄數據類型。用法如下:

function printInfo(value: Staff | Student) {
    if (value instanceof Staff) {
        // 在 if 塊中,value 的數據類型被收窄為 Staff 類型
        console.log('它是 Staff 類型')
    } else {
        // 在 else 塊中,value 的數據類型被收窄為 Student 類型
        console.log('它是 Student 類型')
    }
}

使用 typeof 關鍵字

使用 typeof 能得到值的數據類型,如果變量的類型為基本類型,如:string、number 等,使用 typeof 也能將數據類型收窄。用法如下:

function printType(value: string | number) {
    if (typeof value === 'string') {
        // value 的類型被收窄為 string
        console.log('value 是 string 類型')
    } else {
        // value 的類型被收窄為 number
        console.log('value 是 number 類型')
    }
}
// 用對象上某個字段收窄數據類型
//如果 User 類型的 name 字段為 string 類型,Student 類型的 name 字段為 number 類型
function printObjType(obj: User | Student) {
    if (typeof obj.name === 'string') {
        // value 的類型被收窄為 User
    } else {
        // value 的類型被收窄為 Student
    }
}

自定義類型守衛(wèi)

用 in、instanceof 和 typeof 關鍵字收窄數據類型語法很簡單,但都有各自的局限性。如果它們不能當作類型守衛(wèi),那么能使用 is 關鍵字自定義類型守衛(wèi),寫法為:parameter is Type,這種寫法被稱為類型謂詞,要將它放在函數返回值的位置。

類型謂詞所在的函數被稱為類型謂詞函數,它的返回值必須為 boolean 類型。類型謂詞中的 Type可以是任意合法的 TypeScript 數據類型,parameter 可以是函數的參數也能是 this 關鍵字。

當類型謂詞中的 parameter 是函數的參數,用法如下:

function predicateStudent(value: Student | User): value is Student {
    return typeof (value as any).garde === 'number'
}
function printObjType(obj: User | Student) {
    if (predicateStudent(obj)) {
        // obj的類型被收窄為 Student
    } else {
        // value 的類型被收窄為 User
    }
}

上述代碼中的 predicateStudent 是類型謂詞函數,如果它返回 true,那么參數的數據類型被收窄為 Student。

當類型謂詞中的 parameter 是 this 關鍵字,這種用法通常出現在類的方法中,用法如下:

abstract class User {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
    isStudent(): this is Student {
        return this instanceof Student;
    }
    isStaff(): this is Staff {
        return this instanceof Staff; 
    }
}
class Student extends User{
    grade: number;
    constructor(name: string, grade: number) {
        super(name)
        this.grade = grade
    }
}
class Staff extends User {
    salary: number;
    constructor(name: string, salary: number) {
        super(name)
        this.salary = salary
    }
}
function printObjType(obj: User) {
    if (obj.isStaff()) {
        // obj 的類型被收窄為 Staff
    } else if (obj.isStudent()){
        // obj 的類型被收窄為 Student
    }
}

上述代碼中的 User 是抽象類,不能被實例化,Staff 和 Student 都繼承自 User。實例方法 isStaff 用于將類型收窄為 Staff,實例方法 isStudent 用于將類型收窄為 Student。

總結

在項目中,如果某變量有多種數據類型,不建議使用類型斷言將它斷言成特定的類型,而是使用類型守衛(wèi)根據實際情況將類型收窄,然后按不同的類型分別處理。類型守衛(wèi)能讓應用程序的數據類型更安全,不至于程序在編譯階段不報錯,但在運行階段報錯。

以上就是TypeScript類型斷言VS類型守衛(wèi)示例詳解的詳細內容,更多關于TypeScript類型斷言類型守衛(wèi)的資料請關注腳本之家其它相關文章!

相關文章

  • document.documentElement和document.body區(qū)別介紹

    document.documentElement和document.body區(qū)別介紹

    body是DOM對象里的body子節(jié)點,即body標簽,documentElement 是整個節(jié)點樹的根節(jié)點root,詳細介紹請看本文,感興趣的朋友可以參考下
    2013-09-09
  • Knockoutjs 學習系列(一)ko初體驗

    Knockoutjs 學習系列(一)ko初體驗

    本篇主要簡單介紹了knockoutjs中最重要的概念:可觀察對象(數組)。非常不錯具有參考借鑒價值,感興趣的朋友快來圍觀吧
    2016-06-06
  • JS動態(tài)添加與刪除select中的Option對象(示例代碼)

    JS動態(tài)添加與刪除select中的Option對象(示例代碼)

    本篇文章主要介紹了JS動態(tài)添加與刪除select中的Option對象(示例代碼) 需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • JavaScript進階教程之非extends的組合繼承詳解

    JavaScript進階教程之非extends的組合繼承詳解

    組合繼承有時候也叫偽經典繼承,指的是將原型鏈和借用構造函數技術組合到一塊,從而發(fā)揮二者之長的一種繼承模式,下面這篇文章主要給大家介紹了關于JavaScript進階教程之非extends的組合繼承的相關資料,需要的朋友可以參考下
    2022-08-08
  • 深入理解JavaScript中為什么string可以擁有方法

    深入理解JavaScript中為什么string可以擁有方法

    下面小編就為大家?guī)硪黄钊肜斫釰avaScript中為什么string可以擁有方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • JavaScript中的this到底是什么(一)

    JavaScript中的this到底是什么(一)

    JavaScript中的this總是讓人迷惑,應該是js眾所周知的坑之一。 個人也覺得js中的this不是一個好的設計,由于this晚綁定的特性,它可以是全局對象,當前對象,或者…有人甚至因為坑大而不用this
    2015-12-12
  • JavaScript實現仿新浪微博大廳和騰訊微博首頁滾動特效源碼

    JavaScript實現仿新浪微博大廳和騰訊微博首頁滾動特效源碼

    最近看到朋友用JavaScript實現仿新浪微博大廳和未登錄騰訊微博首頁滾動效果,朋友使用jquery實現的,在網上看到有用js制作的也比較好,于是把我的內容整理分享給大家,具體詳解請看本文
    2015-09-09
  • JS中Attr的用法詳解

    JS中Attr的用法詳解

    本文通過實例代碼給大家介紹了js中的attr的用法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-10-10
  • JS中hasOwnProperty方法用法簡介

    JS中hasOwnProperty方法用法簡介

    hasOwnProperty(propertyName)方法 是用來檢測屬性是否為對象的自有屬性,如果是,返回true,否者false; 參數propertyName指要檢測的屬性名,這篇文章給大家介紹JS中hasOwnProperty方法用法簡介,感興趣的朋友一起看看吧
    2024-01-01
  • JavaScript字符串轉換數字的方法

    JavaScript字符串轉換數字的方法

    這篇文章主要介紹了JavaScript字符串轉換數字的方法,文章圍繞JavaScript字符串轉換數字的相關資料展開全文內容,需要的小伙伴可以參考一下
    2021-12-12

最新評論

类乌齐县| 林周县| 高台县| 本溪市| 平舆县| 乌兰察布市| 永清县| 邵东县| 吉林市| 铅山县| 台湾省| 兰州市| 盐边县| 华容县| 开鲁县| 平远县| 扎赉特旗| 麻栗坡县| 民乐县| 涿州市| 彭泽县| 伊吾县| 惠东县| 呼图壁县| 武功县| 全州县| 龙南县| 紫云| 广州市| 沈丘县| 博白县| 若羌县| 上饶县| 永仁县| 宁武县| 普兰店市| 永丰县| 原阳县| 许昌市| 嘉定区| 阳江市|