javascript中有7種數據類型,分別是:boolean,number,string,null,undefined和object,以及在es6中新增的一種類型 symbol。而typescript又在此基礎上增長了一些類型,接下來一個個來看。javascript
元組類型容許表示一個已知元素數量和類型的數組,各元素的類型沒必要相同,例如:html
let a: [string, number] a = ['hello', 1] a=[1,'hello'] //Error Type 'number' is not assignable to type 'string'... a=['hello'] //Error Property '1' is missing in type '[string]' but required in type '[string, number]'. a=['hello',1,1] //Error Type '[string, number, number]' is not assignable to type '[string, number]'.
上面定義了一個長度爲2的元組,且每一個元素的類型是固定的,當賦值時,各個位置上的元素類型都要對應,元素個數也要一致,否則會報編譯錯誤。java
關於賦值時超出所定義的長度的問題,這在2.6版本以前是被容許的,即上面 a=['hello,1,1] 這樣在2.6版本以前是可行的,此時 [string, number,number]會
被看成 [string,number]
的子類型處理,若是想在2.6以後的版本也達到這樣的效果,能夠定義接口:es6
interface StrNumTuple extends Array<string | number> { 0: string; 1: number; length: 2; // using the numeric literal type '2' }
參考:https://www.tslang.cn/docs/release-notes/typescript-2.7.htmltypescript
咱們也能夠對元組上的單個元素賦值:json
let a: [string, number] a = ['hello', 1] a[1] = 3
由於位置 1 上的類型是數字,因此能夠重賦值爲3數組
當咱們訪問元組中元素時,會對咱們在元素上作的操做進行檢查:函數
let a: [string, number] a = ['hello', 1] a[0].split('') a[1].split('') //Error Property 'split' does not exist on type 'number'.
1位置上是數字類型,因此不可使用split方法。ui
enum
類型是對JavaScript標準數據類型的一個補充。像C#等其它語言同樣,使用枚舉類型能夠爲一組數值賦予友好的名字。例如咱們要定義一組角色,每一個角色用一個數字表明,就能夠用枚舉類型來定義:編碼
enum Roles { ADMIN, EDITOR, USER } let role: Roles = Roles.USER console.log(role) // 2
枚舉裏的每一個值都有編號,默認從0開始,依次排列,因此上面例子裏打印了2。你也能夠修改編號,好比你但願編號從3開始,就能夠定義爲:
enum Roles { ADMIN = 3, EDITOR, USER } let role: Roles = Roles.USER console.log(role) //5
固然你也能夠爲每一個值都賦予不一樣的,不按順序排列的值:
enum Roles { ADMIN = 3, EDITOR = 7, USER = 1 } let role: Roles = Roles.USER console.log(role) // 1
咱們除了能夠經過名字獲得值,也能夠經過值獲得名字:
enum Roles { ADMIN = 3, EDITOR = 7, USER = 1 } // 注意這裏指定爲string類型,名字是string類型 let role: string = Roles[3] console.log(role) // ADMIN
顧名思義,使用這個類型定義後,變量能夠是任意值,這跟直接使用原生javascript開發是同樣的。當咱們不清楚某一變量會是什麼類型時,可使用any類型來經過編譯
let a: any = 'hello' a = 1 a = false a = [1, 2]
如上代碼,使用any定義類型後,能夠任意類型賦值。
有時候用在數組定義上多是頗有用的
let arr: any[] = [1, 'hello', false] arr[0] = 'hi'
能夠看到使用any類型時會讓編碼變得很靈活,可是這就失去了使用typescript的意義,畢竟咱們就是要擺脫這種靈活才選擇用typescript的。因此儘可能能不用any就不用any吧。
某種程度上來講,void
類型像是與any
類型相反,它表示沒有任何類型。 當一個函數沒有返回值時,你一般會見到其返回值類型是 void
:
function fn(): void { console.log('hello world') }
聲明一個void
類型的變量沒有什麼大用,由於你只能爲它賦予 undefined
和 null(這裏是中文官網文檔說的)
let a: void = undefined let b: void = null // Type 'null' is not assignable to type 'void'.
確實能夠賦值爲 undefined,可是賦值爲 null 時報錯了,我覺得是文檔寫錯了,但去看了英文文檔後發現是這樣的:
要想賦值爲 null 時不報錯,在tsconfig.json文件裏找到 strictNullChecks 選項,去掉註釋,值改成false,保存後重編譯就沒問題了。
never表示的是哪些用不存在的值的類型。它能夠是那些總會拋出異常或者根本不會有返回值的函數表達式的返回值類型,也能夠是變量的類型,此時變量被永不爲真的類型保護所約束。
function error():never{ throw new Error('異常') }
上面函數老是拋出異常,因此它的返回值類型是never,表示永遠不會有返回值
function func():never{ while(true){} }
這段代碼裏的函數也是永遠沒有返回值,返回值類型也是never。它與void類型不同,函數如果不想返回值須要指定void類型,未指定的都必須有返回值。