自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Typescript 類型的本質(zhì)是什么

開(kāi)發(fā) 前端
類型指的是變量的類型,而變量是一塊內(nèi)存空間,不同類型的變量會(huì)占用不同的字節(jié)數(shù),而且可以做的操作也不同。number、boolean、string 等類型的變量會(huì)占用不同的內(nèi)存大小。

[[418172]]

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

類型

類型指的是變量的類型,而變量是一塊內(nèi)存空間,不同類型的變量會(huì)占用不同的字節(jié)數(shù),而且可以做的操作也不同。number、boolean、string 等類型的變量會(huì)占用不同的內(nèi)存大小。

類型分為基礎(chǔ)類型和引用類型,基礎(chǔ)類型分配在棧上,而引用類型分配在堆上,之所以有引用類型是因?yàn)檫@種類型是復(fù)合出來(lái)的,比如對(duì)象,它可能有任意多個(gè)屬性,這種就放在可動(dòng)態(tài)分配內(nèi)存的堆上,然后在棧上記錄下該地址,這就是引用類型。

類型是運(yùn)行時(shí)的變量的內(nèi)存空間大小和可以做的操作的標(biāo)識(shí),但是代碼中不一定包含,根據(jù)代碼中是否有類型的標(biāo)識(shí),語(yǔ)言分為了靜態(tài)類型語(yǔ)言和動(dòng)態(tài)類型語(yǔ)言。

靜態(tài)類型、動(dòng)態(tài)類型、類型安全

動(dòng)態(tài)類型語(yǔ)言的代碼中沒(méi)有記錄變量的類型,對(duì)什么變量賦什么值做什么操作都是可以的,這樣寫(xiě)代碼時(shí)不用考慮類型的問(wèn)題,比較簡(jiǎn)單,但是也有隱患,就是運(yùn)行時(shí)變量賦值時(shí)發(fā)現(xiàn)類型不一致,或者調(diào)用了沒(méi)有的方法等,這是動(dòng)態(tài)類型語(yǔ)言的缺點(diǎn)。

靜態(tài)類型語(yǔ)言則是把類型的標(biāo)識(shí)保存在了代碼里,也就是有靜態(tài)類型系統(tǒng)。聲明的變量的類型在運(yùn)行時(shí)會(huì)分配相應(yīng)的內(nèi)存空間,就會(huì)賦相同類型的值,就會(huì)調(diào)用該類型有的方法,如果不是,在編譯時(shí)就能檢查出來(lái)。

這種同樣類型的變量只賦值同類型的值,只做該類型允許的操作就叫做類型安全,顯然,動(dòng)態(tài)類型是類型不安全的,會(huì)在運(yùn)行時(shí)有各種類型相關(guān)問(wèn)題,而靜態(tài)類型則通過(guò)類型系統(tǒng)在編譯期間就把類型不安全的操作檢查了出來(lái)進(jìn)行報(bào)錯(cuò),所以是類型安全的。

typescript 就是給動(dòng)態(tài)類型的 javascript 添加了一套靜態(tài)類型系統(tǒng),是 javascript 的超集。

靜態(tài)類型系統(tǒng)的 3 個(gè)層次

其實(shí)靜態(tài)類型系統(tǒng)分為 3 個(gè)層次:

純靜態(tài)的類型系統(tǒng)

第一種就是純靜態(tài)的類型系統(tǒng),變量的類型都是定義時(shí)聲明的,但有一個(gè)問(wèn)題就是遇到參數(shù)的類型可能是多種類型的時(shí)候會(huì)比較麻煩。一些古老的語(yǔ)言是這種。

比如:

  1. int add(int a, int b) { 
  2.     return a + b; 
  3. double add(double a, double b) { 
  4.     return a + b; 

帶泛型的靜態(tài)類型系統(tǒng)

第二種是帶泛型的靜態(tài)類型系統(tǒng),泛型也叫類型參數(shù),具體的類型可以通過(guò)泛型參數(shù)來(lái)動(dòng)態(tài)確定,多了一定的靈活性。java 是這種。

比如:

  1. add<T>(T a, T b) { 
  2.     return a + b; 

支持高級(jí)類型的靜態(tài)類型系統(tǒng)

第三種是支持高級(jí)類型的靜態(tài)類型系統(tǒng),高級(jí)類型就是生成類型的類型,它除了可以傳泛型參數(shù)外還可以支持分支、遞歸、取屬性等操作,可以通過(guò)復(fù)雜的邏輯來(lái)生成類型。typescript 是這種。

比如下面的高級(jí)類型:

  1. type RepeatN<Item, N extends number, Tuple extends any[] = []> = Tuple['length'] extends N ? Tuple : RepeatN<Item, N, [...Tuple, Item]>; 

它的作用是當(dāng)傳入泛型參數(shù)時(shí),返回該參數(shù)重復(fù) n 次的元組:

  1. type res = RepeactN<'a', 3>; 
  2. // res 為 ['a''a''a'

高級(jí)類型支持類型編程,甚至是圖靈完備的,圖靈完備的意思就是說(shuō)提供的語(yǔ)言特性可以描述所有可計(jì)算的邏輯。也就是所有用 javascript 寫(xiě)的邏輯在 typescript 中用類型都可以實(shí)現(xiàn),只不過(guò)具體語(yǔ)法有不同。

高級(jí)類型示例

就拿上面這個(gè)把參數(shù)重復(fù) n 次的代碼來(lái)說(shuō),如果用 javascript 我們會(huì)這樣寫(xiě):

  1. function repeactN(item, n) { 
  2.     const res = []; 
  3.     for (let i = 0; i< n; i++) { 
  4.         res[i] = item; 
  5.     } 
  6.     return res; 

用 typescript 的類型系統(tǒng)怎么寫(xiě)呢?

圖靈完備意味著兩者都能實(shí)現(xiàn)同樣的邏輯,只不過(guò)實(shí)現(xiàn)方式不同。我們只要把邏輯想清楚,然后用類型支持的語(yǔ)法實(shí)現(xiàn)即可。

首先,函數(shù)參數(shù)在 ts 類型里就是泛型參數(shù),變量在 ts 類型里也用泛型參數(shù)來(lái)存儲(chǔ),循環(huán)在 ts 類型利用遞歸來(lái)實(shí)現(xiàn),所以就是這樣的:

首先定義類型,Item 是重復(fù)的目標(biāo), n 是個(gè)數(shù),然后第三個(gè)參數(shù) Tuple 用來(lái)存儲(chǔ)結(jié)果

 

  1. type RepeatN<Item, N extends number, Tuple extends any[] = []> 

然后具體的實(shí)現(xiàn)就是要不斷的往 Tuple 里放 Item,遞歸構(gòu)造 

  1. RepeatN<Item, N, [...Tuple, Item]> 

直到 Tuple 的 length 到了 N

  1. Tuple['length'] extends N ? Tuple : RepeatN<Item, N, [...Tuple, Item]>; 

所以,完整的類型就是這樣的:

  1. type RepeatN<Item, N extends number, Tuple extends any[] = []> = Tuple['length'] extends N ? Tuple : RepeatN<Item, N, [...Tuple, Item]>; 

通過(guò)這個(gè)高級(jí)類型我們可以感受到,typescript 的靜態(tài)類型系統(tǒng)就是第三種,可以支持類型編程,可以實(shí)現(xiàn)各種復(fù)雜邏輯,最終生成目標(biāo)類型。

tyepscript 類型系統(tǒng)復(fù)雜度的原因

為什么 tyepscript 要設(shè)計(jì)這么復(fù)雜的類型系統(tǒng)呢?

靜態(tài)類型的目的就是把運(yùn)行時(shí)的行為在編譯時(shí)就檢查出來(lái),那么就要在編譯期間就要確定最終類型,而 javascript 邏輯又很靈活,所以想還沒(méi)運(yùn)行就確定類型就需要各種類型的推導(dǎo)來(lái)生成最終類型,所以也就設(shè)計(jì)出了帶高級(jí)類型的靜態(tài)類型系統(tǒng)。

tyepscript 靜態(tài)類型系統(tǒng)的復(fù)雜度主要是因?yàn)?javascript 比較靈活導(dǎo)致的,是不可避免的。

總結(jié)

類型本質(zhì)上是運(yùn)行時(shí)變量的內(nèi)存大小和可對(duì)它進(jìn)行的操作,變量只賦值同類型的值就是類型安全,動(dòng)態(tài)類型在源碼中沒(méi)有類型信息,沒(méi)法保證類型安全,而靜態(tài)類型則是在源碼中有類型信息,可以在編譯期間檢查出類型的錯(cuò)誤,保證類型安全。

javascript 就是動(dòng)態(tài)類型語(yǔ)言,雖然寫(xiě)代碼比較簡(jiǎn)單,但是運(yùn)行時(shí)很容易出類型安全問(wèn)題,typescript 就是解決了 javascript 沒(méi)有靜態(tài)類型系統(tǒng)的問(wèn)題而做的擴(kuò)展。ts 的類型系統(tǒng)是支持泛型、支持高級(jí)類型的靜態(tài)類型系統(tǒng),而且類型的語(yǔ)法是圖靈完備的,也就是各種邏輯都可以表達(dá),只不過(guò)和 js 中的語(yǔ)法會(huì)有不同。這也是 ts 給 js 擴(kuò)展的這套類型系統(tǒng)中最復(fù)雜的部分,被大家戲稱為類型體操,但是這種復(fù)雜度是為了讓 javascript 變得類型安全不可避免的。 

其實(shí)高級(jí)類型的所謂類型體操也沒(méi)有那么難,只要想清楚要表達(dá)的邏輯,然后一步步用相應(yīng)的語(yǔ)法實(shí)現(xiàn)即可,只不過(guò)語(yǔ)法會(huì)有一些別扭,比如變量用泛型參數(shù)實(shí)現(xiàn)、循環(huán)用遞歸實(shí)現(xiàn)等,但只要理清邏輯,實(shí)現(xiàn)起來(lái)還是不難的。

 

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

2012-04-16 15:14:47

web設(shè)計(jì)

2015-08-31 13:43:27

運(yùn)維

2024-12-13 08:24:23

2021-11-09 23:15:20

編程語(yǔ)言本質(zhì)

2021-07-31 23:25:34

CSS布局UI

2013-12-19 15:56:50

去IOE數(shù)據(jù)庫(kù)服務(wù)器

2018-04-04 14:29:33

2021-09-03 09:12:09

Linux中斷軟件

2023-07-04 07:53:53

MVCDDD架構(gòu)

2015-10-10 10:51:25

數(shù)據(jù)本質(zhì)大數(shù)據(jù)

2022-04-28 08:12:29

函數(shù)調(diào)用進(jìn)程切換代碼

2018-03-21 09:08:06

超融合架構(gòu)本質(zhì)

2020-12-18 11:35:22

TypeScript語(yǔ)言Java

2015-03-23 13:50:46

云計(jì)算本質(zhì)B2C

2021-07-27 06:06:34

TypeScript語(yǔ)言運(yùn)算符

2022-02-25 09:06:02

TypeScripnever工具

2013-07-23 13:06:50

2018-01-09 15:18:08

2021-08-16 07:51:20

Linux 中斷Linux 系統(tǒng)

2022-08-08 09:00:42

TypeScript映射類型
點(diǎn)贊
收藏

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