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

Typescript 類型的本質是什么

開發 前端
類型指的是變量的類型,而變量是一塊內存空間,不同類型的變量會占用不同的字節數,而且可以做的操作也不同。number、boolean、string 等類型的變量會占用不同的內存大小。

[[418172]]

本文轉載自微信公眾號「神光的編程秘籍」,作者神說要有光。轉載本文請聯系神光的編程秘籍公眾號。

類型

類型指的是變量的類型,而變量是一塊內存空間,不同類型的變量會占用不同的字節數,而且可以做的操作也不同。number、boolean、string 等類型的變量會占用不同的內存大小。

類型分為基礎類型和引用類型,基礎類型分配在棧上,而引用類型分配在堆上,之所以有引用類型是因為這種類型是復合出來的,比如對象,它可能有任意多個屬性,這種就放在可動態分配內存的堆上,然后在棧上記錄下該地址,這就是引用類型。

類型是運行時的變量的內存空間大小和可以做的操作的標識,但是代碼中不一定包含,根據代碼中是否有類型的標識,語言分為了靜態類型語言和動態類型語言。

靜態類型、動態類型、類型安全

動態類型語言的代碼中沒有記錄變量的類型,對什么變量賦什么值做什么操作都是可以的,這樣寫代碼時不用考慮類型的問題,比較簡單,但是也有隱患,就是運行時變量賦值時發現類型不一致,或者調用了沒有的方法等,這是動態類型語言的缺點。

靜態類型語言則是把類型的標識保存在了代碼里,也就是有靜態類型系統。聲明的變量的類型在運行時會分配相應的內存空間,就會賦相同類型的值,就會調用該類型有的方法,如果不是,在編譯時就能檢查出來。

這種同樣類型的變量只賦值同類型的值,只做該類型允許的操作就叫做類型安全,顯然,動態類型是類型不安全的,會在運行時有各種類型相關問題,而靜態類型則通過類型系統在編譯期間就把類型不安全的操作檢查了出來進行報錯,所以是類型安全的。

typescript 就是給動態類型的 javascript 添加了一套靜態類型系統,是 javascript 的超集。

靜態類型系統的 3 個層次

其實靜態類型系統分為 3 個層次:

純靜態的類型系統

第一種就是純靜態的類型系統,變量的類型都是定義時聲明的,但有一個問題就是遇到參數的類型可能是多種類型的時候會比較麻煩。一些古老的語言是這種。

比如:

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

帶泛型的靜態類型系統

第二種是帶泛型的靜態類型系統,泛型也叫類型參數,具體的類型可以通過泛型參數來動態確定,多了一定的靈活性。java 是這種。

比如:

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

支持高級類型的靜態類型系統

第三種是支持高級類型的靜態類型系統,高級類型就是生成類型的類型,它除了可以傳泛型參數外還可以支持分支、遞歸、取屬性等操作,可以通過復雜的邏輯來生成類型。typescript 是這種。

比如下面的高級類型:

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

它的作用是當傳入泛型參數時,返回該參數重復 n 次的元組:

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

高級類型支持類型編程,甚至是圖靈完備的,圖靈完備的意思就是說提供的語言特性可以描述所有可計算的邏輯。也就是所有用 javascript 寫的邏輯在 typescript 中用類型都可以實現,只不過具體語法有不同。

高級類型示例

就拿上面這個把參數重復 n 次的代碼來說,如果用 javascript 我們會這樣寫:

  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 的類型系統怎么寫呢?

圖靈完備意味著兩者都能實現同樣的邏輯,只不過實現方式不同。我們只要把邏輯想清楚,然后用類型支持的語法實現即可。

首先,函數參數在 ts 類型里就是泛型參數,變量在 ts 類型里也用泛型參數來存儲,循環在 ts 類型利用遞歸來實現,所以就是這樣的:

首先定義類型,Item 是重復的目標, n 是個數,然后第三個參數 Tuple 用來存儲結果

 

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

然后具體的實現就是要不斷的往 Tuple 里放 Item,遞歸構造 

  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]>; 

通過這個高級類型我們可以感受到,typescript 的靜態類型系統就是第三種,可以支持類型編程,可以實現各種復雜邏輯,最終生成目標類型。

tyepscript 類型系統復雜度的原因

為什么 tyepscript 要設計這么復雜的類型系統呢?

靜態類型的目的就是把運行時的行為在編譯時就檢查出來,那么就要在編譯期間就要確定最終類型,而 javascript 邏輯又很靈活,所以想還沒運行就確定類型就需要各種類型的推導來生成最終類型,所以也就設計出了帶高級類型的靜態類型系統。

tyepscript 靜態類型系統的復雜度主要是因為 javascript 比較靈活導致的,是不可避免的。

總結

類型本質上是運行時變量的內存大小和可對它進行的操作,變量只賦值同類型的值就是類型安全,動態類型在源碼中沒有類型信息,沒法保證類型安全,而靜態類型則是在源碼中有類型信息,可以在編譯期間檢查出類型的錯誤,保證類型安全。

javascript 就是動態類型語言,雖然寫代碼比較簡單,但是運行時很容易出類型安全問題,typescript 就是解決了 javascript 沒有靜態類型系統的問題而做的擴展。ts 的類型系統是支持泛型、支持高級類型的靜態類型系統,而且類型的語法是圖靈完備的,也就是各種邏輯都可以表達,只不過和 js 中的語法會有不同。這也是 ts 給 js 擴展的這套類型系統中最復雜的部分,被大家戲稱為類型體操,但是這種復雜度是為了讓 javascript 變得類型安全不可避免的。 

其實高級類型的所謂類型體操也沒有那么難,只要想清楚要表達的邏輯,然后一步步用相應的語法實現即可,只不過語法會有一些別扭,比如變量用泛型參數實現、循環用遞歸實現等,但只要理清邏輯,實現起來還是不難的。

 

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2012-04-16 15:14:47

web設計

2013-12-19 15:56:50

去IOE數據庫服務器

2015-08-31 13:43:27

運維

2021-11-09 23:15:20

編程語言本質

2024-12-13 08:24:23

2021-07-31 23:25:34

CSS布局UI

2018-04-04 14:29:33

2021-09-03 09:12:09

Linux中斷軟件

2023-07-04 07:53:53

MVCDDD架構

2015-10-10 10:51:25

數據本質大數據

2022-04-28 08:12:29

函數調用進程切換代碼

2018-03-21 09:08:06

超融合架構本質

2020-12-18 11:35:22

TypeScript語言Java

2015-03-23 13:50:46

云計算本質B2C

2013-07-23 13:06:50

2022-02-25 09:06:02

TypeScripnever工具

2021-07-27 06:06:34

TypeScript語言運算符

2021-08-16 07:51:20

Linux 中斷Linux 系統

2018-01-09 15:18:08

2024-05-11 10:19:31

TypeScript類型接口
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线看无码的免费网站 | 国产精品久久久久久久久免费 | 久久久精品一区二区三区 | 视频在线一区 | 黄色大片在线免费观看 | 精品国产一二三区 | 亚洲欧美一区二区三区国产精品 | 久久久一| 一区二区三区免费 | 国产精品一区二区不卡 | 性欧美精品一区二区三区在线播放 | 国产精品99精品久久免费 | 亚洲小视频在线观看 | 影音先锋中文字幕在线观看 | caoporn免费 | 欧美精品一区三区 | 涩涩视频网站在线观看 | 欧美极品少妇xxxxⅹ免费视频 | 精品久久香蕉国产线看观看亚洲 | 麻豆久久久久 | 韩日一区二区三区 | 日韩欧美亚洲 | 国产丝袜一区二区三区免费视频 | 国产欧美精品一区二区三区 | 亚洲毛片网站 | 欧美另类日韩 | 国产一伦一伦一伦 | 97精品超碰一区二区三区 | 国产日屁 | 日韩中文在线视频 | 国产激情91久久精品导航 | 亚洲永久| 亚洲首页| 一区二区三区四区在线 | 欧美成人精品二区三区99精品 | 四虎影院在线免费观看 | 久久久久久一区 | 成人国产免费视频 | 国产特级毛片 | 欧美国产精品 | 日韩精品久久 |