2.TypeScript徹底解讀-基礎類型html
src下新建example文件夾並新建文件。basic-type.ts。截圖中單詞拼錯了。後需注意一下是basic-type.tses6
能夠裝tslint的插件,配合tslint能夠作到很好的代碼提示typescript
boolean表示布爾類型npm
這裏咱們用let聲明瞭一個變量bool的類型是boolean布爾類型的。能夠先給他賦值,json
第二行是先聲明後賦值的形式數組
上面聲明瞭bool爲布爾類型的,後面再賦值123的話就會報錯 有提示的錯誤函數
123是數字自變量的類型spa
ts和js同樣數字都是浮點類型,因此只有一個類型number類型插件
聲明變量num的類型是number 這裏報錯code
緣由是由於index.ts內聲明瞭重複的變量,咱們把index.ts內的代碼先刪掉就能夠了
若是咱們把字符串複製給num也是不能夠的
ts中支持es6中新增的二進制和八進制數字自變量的
支持二進制、八進制、十進制和十六進制 四種進制的數值
//數值類型 let num: number = 123 // num = 'abc' num = 0b1111011 //這是一個二進制的123 num = 0o173//八進制 num = 0x7b //十六進制
在ts中還可使用es6的新語法,模板字符串
string | number 必定要放在括號裏面,後面再加上[]表示這是一個數組
對應的類型不符合就會報錯,後面賦值的時候,類型必須和上面定義的類型是一一對應的才行
上面定義的數字是三個值,若是在下面賦值的時候賦值第四個值也是不行,會報錯。
對比注意點2.6版本和2.6版本後是有區別的,把這些超出長度的值叫作越界元素
2.6版本以前,只要你越界的元素是前面規定的幾種類型之一就能夠,
2.6版本以後,長度必須按照規定類型的長度,超出的元素無論你的類型是什麼,都是不能夠的
定義一個基礎的枚舉值形式,超級管理員,管理員和基礎用戶 三個角色
習慣枚舉以大寫字母開頭,例如這裏定義的Roles
這裏輸出的SUPER_ADMIN在枚舉裏面是第一個因此輸出了0,那麼ADMIN就是1 USER就是2
咱們也能夠自定義序號
也能夠只寫第一個爲1,那麼後面的自動遞增,USER就是3
指定中間的值是4,那麼後面的就遞增是5
superadmin仍是0,
經過索引值,取到對應的名字
能夠經過typescript官方查看實時編譯的結果
http://www.typescriptlang.org/play/index.html
any表示任何類型
制定類型是any類型後,就能夠想賦什麼值就賦什麼值
也能夠給它賦值數字或者bool類型
咱們還能夠定義一個數組是any類型。那麼在裏面寫什麼值都是能夠的了
any能不用的時候儘可能不要用
和any類型是相反的。any類型表示客戶是任意類型。void類型表示沒有任何類型,什麼類型都不是
例如咱們 定義一個函數,給他指定什麼類型都不返回就給他返回一個void類型
傳入的text必須制定類型
這個時候就能體現ts的優越性了。指定類型,編寫代碼的時候就會給咱們提示錯誤。
這個地方必須傳入字符串類型,
指定返回值類型是void
在js中若是函數沒有指定返回類型那麼默認是undefined,這個地方咱們沒有默認返回值,因此他默認返回undefined。
void類型的值 能夠給他賦值undefined或者null
void就表示你這個函數沒有返回任何類型的值
這裏v咱們給他賦值null 竟然報錯了。
這是由於咱們的ts配置文件裏面。strict設置爲true,那麼會嚴格檢查,這個選項也會默認爲true。其中strictNullChecks是控制嚴格檢查的,v賦值null報錯就是由於 strictNullChecks設置爲true形成的
暫時這裏先把strict這裏註釋掉
這樣再把null賦值給v就不會提示錯了。
修改了tsconfig.json須要從新編譯,這裏npm start 從新啓動就能夠了。
noImplicitAny: true 影響的就是不指定參數類型
影響的就是指定的參數類型
在js中這倆 null 和 undefined 是基礎數據類型。在ts中他們既是值也是類型
指定它是undefined類型那麼 就只能給他賦值undefined的類型
若是咱們給它賦123呢那麼確定就會報錯了
同上 null類型
null和undefined是其餘類型的子類型
你能夠把這兩個值賦給其餘任意類型的值
例如咱們前面定義的num數字類型,。咱們便可給它賦值爲undefined也能夠給他賦值爲null類型
如咱們把配合文件 "strictNullChecks": true, 配置項打開
那麼這裏就會報錯了,咱們就不能把undefined類型賦值給其餘的類型, 就只能賦值給undefined類型的
若是你要求比較高的話 是能夠把這些嚴格檢查都開一下 。這裏咱們仍是先註釋掉
表示永遠不存在的類型
函數拋異常,之類的返回類型就是never類型
還有一種狀況就是死循環
、
調用一下拋錯的函數
never是任何任意類型的子類型,never能夠賦值給其餘任意類型,沒有任何類型是never的子類型
這裏定義一個當即執行函數,那麼選中的這裏的值就是never類型的
這個變量,咱們鼠標選中放過來 就提示是never類型的
never類型只能賦值never類型,這裏賦值123 就會報錯了。
num是數值類型,咱們能夠把never類型賦值給它
存的是對象在內存中地址的引用
咱們定義一個對象,obj存的就是這個對象在內存中地址的引用
若是把obj賦值給obj2 那麼obj2也是內存地址的引用
obj2修改的就是引用的地址的
定義一個方法接收參數就是一個對象類型,而後在裏面打印出來這個obj。上面已經修改obj2.name= ‘W’了因此輸出的anme是W
有點像是類型轉換
經過固定語法把某個值強行指定爲咱們要制定的類型
若是這個值有length屬性或者這個length屬性的值爲0,直接返回傳入的值的length。若是傳入的是數值,先經過toString方法,再獲取length
這裏咱們規定參數的類型爲string或者是number,方法返回爲number類型
這樣這裏就報錯了。實際上真正的緣由是,類型number不存在屬性length,之因此形成這個緣由是由於,咱們這個target多是string 也多是number類型。
若是傳入number是沒有length屬性的 因此就會報錯了,可是咱們知道這個函數代碼實際上沒有問題的。錯就錯在ts在這個地方作了類型的判斷。
因此這裏咱們經過類型斷言來指定類型
類型斷言有兩種寫法
這裏制定target就是一個stirng類型
第二種寫法: as
這樣咱們三個地方都加上類型斷言就沒有問題啦
後面講自定義類型保護的時候 就不用寫這麼屢次類型斷言了。
這兩種寫法雖然均可以,可是你之後使用JSX的話 只能適應as這種形式,不能使用尖括號的形式,尖括號形式看起來像是一個標籤