成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

【Typescript 類型檢查原理】類型守衛(wèi)是如何實(shí)現(xiàn)的

開發(fā) 前端
typscript 的高級類型的推導(dǎo)的目的就是縮小可能性范圍,讓類型更精確。有的時(shí)候,在進(jìn)入一些分支的時(shí)候,類型就確定了,這時(shí)候就可以暫時(shí)性的對類型做范圍的縮小,這叫做類型守衛(wèi)。

[[404620]]

本文轉(zhuǎn)載自微信公眾號「神光的編程秘籍」,作者神說要有光zxg。轉(zhuǎn)載本文請聯(lián)系神光的編程秘籍公眾號。

這一節(jié)我們來理一下類型守衛(wèi)的實(shí)現(xiàn)原理,因?yàn)閮?nèi)容比較多,分為上下兩篇,上篇講實(shí)現(xiàn)思路,下篇是代碼實(shí)現(xiàn)。

什么是類型守衛(wèi)

javascript 的類型代表了一種可能性,表示可能占用的內(nèi)存大小、可能調(diào)用的方法等。typescript 的類型包含了 javascript 的類型,并且對可以對類型做交集、并集、各種推導(dǎo),最終產(chǎn)生準(zhǔn)確的類型。typescript 的類型的推導(dǎo)也是一種可能性的推導(dǎo),目標(biāo)是得出的類型更準(zhǔn)確的描述具體的變量類型。

精準(zhǔn)就意味著要做一些類型的可能性的縮小,各種類型編程的目的都是產(chǎn)生更小更準(zhǔn)確的類型,類型守衛(wèi)也是這個(gè)目的。

類型推導(dǎo)是使得整個(gè)類型變得更小更準(zhǔn)確,而類型守衛(wèi)則是當(dāng)類型進(jìn)入某個(gè)分支的時(shí)候,暫時(shí)性的變得更小更精確,使得類型檢查更準(zhǔn)確。

比如下面的代碼,整體類型是 string| number,這是一個(gè)聯(lián)合類型,當(dāng) a 進(jìn)入 if 分支的時(shí)候,類型明顯只可能是 string,別的情況進(jìn)不來,這時(shí)候可以做進(jìn)一步的類型縮小,這就叫做類型守衛(wèi)。

  1. function func(a: string| number): string { 
  2.     if (typeof a === 'string') { 
  3.         return a.toLocaleLowerCase(); 
  4.     } else { 
  5.         return a.toFixed(1); 
  6.     } 

類型守衛(wèi)的目的就是讓整體的類型在一些確定的條件下暫時(shí)性的變得更小更精確。這種條件包括 typeof、instanceOf、in、===、!==、==、!=。

為什么這些條件下可以縮小類型呢?因?yàn)槟軌蜻M(jìn)入這些分支,那么變量顯然只可能是改種類型,所以類型的可能性自然可以做進(jìn)一步的縮小。

比如 in 操作符觸發(fā)的類型守衛(wèi):

=== 判斷觸發(fā)的類型守衛(wèi):

同理 instanceof 等也是一樣,只要是進(jìn)入能夠確定具體類型的分支,那么類型就可以做縮小。

在 ts 4.3 中,泛型的類型縮小也做了支持(之前只能通過類型斷言來縮小類型)。

類型縮小是自動(dòng)的類型斷言,當(dāng)有的時(shí)候類型縮小或者類型推導(dǎo)都不行的時(shí)候,就用 as 手動(dòng)類型斷言。

實(shí)現(xiàn)思路分析

我們知道了類型縮小是在在進(jìn)入條件分支的時(shí)候,對類型檢查用的類型做暫時(shí)性的縮小,那么實(shí)現(xiàn)的時(shí)候自然就是在 if、switch 的分支的檢查時(shí),對類型做一些處理。

ts 的類型檢查是先通過解析配置文件的 includes、exclues、files 等,結(jié)合 lib、types、typeRoots 的配置來確定要做檢查的所有文件,然后對每個(gè)文件依次進(jìn)行遞歸下降的類型檢查。

當(dāng)檢查到 if、switch 的節(jié)點(diǎn)的時(shí)候,我們只需要判斷 test 部分是否是一個(gè) BinaryExpression,并且 operator 是 in、===、!==、instanceOf 等情況。

根據(jù) operator 的不同分別做不同的判斷:

  • in:判斷 left 是否是 right 變量的類型的一個(gè)屬性,如果是,對類型做縮小
  • instanceof:判斷 left 的類型是否是 right 變量的類型的子類型,如果是,對類型做縮小
  • === / !==: 分為包含 typeof 和不包含 typeof 兩種:
    • 不包含 typeof:判斷 left 和 right 是否相等,如果是,把類型縮小到具體的字面量類型。
    • 包含 typeof:如果兩邊有一邊是 typeof 的 UnaryExpression,則取類型之后再做比較,如果是,把類型縮小到具體的類型

總結(jié)

typscript 的高級類型的推導(dǎo)的目的就是縮小可能性范圍,讓類型更精確。有的時(shí)候,在進(jìn)入一些分支的時(shí)候,類型就確定了,這時(shí)候就可以暫時(shí)性的對類型做范圍的縮小,這叫做類型守衛(wèi)。

觸發(fā)條件有 in、instanceof、typeof、===、!== 等能夠讓類型更準(zhǔn)確的判斷。

類型守衛(wèi)相當(dāng)于自動(dòng)的類型斷言,當(dāng)類型守衛(wèi)搞不定的時(shí)候,就手動(dòng)用類型斷言 as 來縮小類型。

 

我們梳理了實(shí)現(xiàn)類型守衛(wèi)的思路,就是遇到條件語句 IfStatement、SwitchStatement 的時(shí)候,對 test 部分做判斷,如果包含 in、instanceof、typeof 等,做相應(yīng)的類型處理,之后再進(jìn)行類型檢查。

 

責(zé)任編輯:武曉燕 來源: 神光的編程秘籍
相關(guān)推薦

2021-06-05 21:30:24

typescriptOverride檢查

2022-04-11 08:42:09

TypeScript子類型定義

2022-05-04 09:02:41

TypeScript類型工具

2009-07-22 09:43:30

Scala類型

2023-01-05 08:09:27

GroovyDSL?

2022-04-10 19:26:07

TypeScript類型語法

2020-12-18 11:35:22

TypeScript語言Java

2022-09-14 15:24:57

typescript快排

2022-02-25 09:06:02

TypeScripnever工具

2021-07-27 06:06:34

TypeScript語言運(yùn)算符

2013-07-09 14:41:58

C動(dòng)態(tài)類型

2022-09-20 14:43:55

TypeScript類型體操

2024-05-11 10:19:31

TypeScript類型接口

2021-08-18 07:56:05

Typescript類型本質(zhì)

2022-08-08 09:00:42

TypeScript映射類型

2023-06-13 18:24:26

TypeScriptJSDoc開發(fā)

2024-07-30 10:27:10

TypeScript配置TS

2022-02-09 08:11:50

架構(gòu)

2025-01-20 00:13:19

TypeScript操作符數(shù)據(jù)類型

2024-11-14 08:31:02

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产一区二区在线免费观看 | 一级免费a| 一区二区三区四区不卡 | 中文字幕一区在线观看视频 | 久久久久久久久久毛片 | 91av小视频 | 久热久| 91在线色视频 | 午夜成人免费视频 | 一级在线视频 | 九七午夜剧场福利写真 | 欧美一级在线 | 免费视频成人国产精品网站 | 国产高清一区二区 | 国产精品美女久久久 | 欧美 日韩 亚洲91麻豆精品 | av中文字幕网站 | 在线āv视频 | 高清色视频| 久久99久久98精品免观看软件 | 精品国产免费人成在线观看 | 欧美激情综合网 | 中文字字幕在线中文乱码范文 | 亚洲精彩视频在线观看 | 精品国产91 | 久久精品国产清自在天天线 | 狠狠色综合网站久久久久久久 | 看a级黄色毛片 | 亚洲精品国产第一综合99久久 | 7777在线| 一级视频在线免费观看 | 国产在线播 | 91视频导航| xxxcom在线观看| 亚洲成人中文字幕 | 涩涩导航| 国产日韩久久 | 精品人伦一区二区三区蜜桃网站 | 亚洲人一区| 精品国产一区探花在线观看 | 亚洲一区综合 |