TypeScript徹底解讀(26課時)_11.TypeScript徹底解讀-類型推論和兼容性

11.TypeScript徹底解讀-類型推論和兼容性

 

在一些時候省略指令,ts會幫咱們推斷出省略的類型的地方適合的類型,經過學習ts的類型推論瞭解ts的推論規則windows

類型兼容性就是爲了適應js靈活的特色,從而在一些狀況下只要兼容的類型便可經過檢測數組

建立文件並在index.ts中引入dom

類型推論

這裏定義的name沒有給他制定是什麼類型的值,賦值一個字符串,ts就會給咱們推斷出name多是想要一個字符串的類型函數

當咱們再給這個name賦值一個數值類型就會報錯 了。學習

多類型聯合

咱們不制定類型,ts會自動推斷爲聯合類型對象

也就是這樣,指定的狀況blog

賦值爲帶布爾值的就不行了接口

都是經過等號右邊的值,推斷出左邊的變量是什麼類型的事件

上下文類型

根據等號左邊去推斷右邊ip

js中的一些方法或者對象在ts中找不到,說明須要引入一些庫

這裏引入dom的庫

這裏綁定一個鼠標的點擊事件

經過點.就能夠把能訪問的屬性和方法都列出來

例如這裏我訪問一個.a由於是沒有a這個屬性的 就會報錯。這裏是由於已經推斷出mouseEvent這個參數的類型。這就是根據左邊的windows.onmousedown推斷出了參數爲鼠標的事件對象。這句是上下文類型

類型兼容性

定義一個接口Info,而後定義一個變量,infos類型是接口Info

而後再定義三個對象。 info1給infos賦值沒有報錯,是由於這個對象徹底符合接口的定義

info2賦值給infoInterface就報錯了

info3賦值也沒有報錯,首先要求必須有name字段。info3是有的,可是info3多了一個age是沒有問題的,必需要有name,多了無所謂

 

接口內再加一個info的屬性是一個對象,裏面包含age屬性,這樣下面的兩個賦值都會報錯了。

給info1加上info這個對象,可是是個空的對象,也是會報錯。

這樣加上再賦值就不會報錯了,age的類型也必須是數字類型的

函數的兼容性

11分44秒

返回的都爲10.x賦值給y是沒問題的

y賦值給x就會報錯

錯誤。類型參數個數的要求後面的函數的參數個數必須小於等於左邊的函數的參數個數

遍歷數組arrs,用foEach其實其餘的兩個參數是用不到的

不寫後面兩個參數的狀況

forEach要求三個函數,可是實際上咱們只用到了一個參數,咱們我複製的函數的參數的個數 必定是小於被賦值的參數個數的

函數參數類型的要求

y賦值給x參數類型不一樣就會報錯

可選參數和剩餘參數

這裏其實是一個數組的求和的操做

打印出來求和的結果

 

不用可選參數,傳入三個參數arg一、arg二、arg3三個參數,最終返回三個參數的和

函數參數雙向協變

22分10秒

使用箭頭函數,裏面什麼都不定義

funcB賦值給funcA是能夠的

A賦值給B也是能夠的,funcA的類型既能夠是number也能夠是stirng類型

返回值類型

定義返回值類型是string或者number聯合類型

y賦值給x沒有問題,y是stirng類型,x既能夠是string類型,也能夠是number類型

x賦值給y就會報錯了

z賦值給y也是報錯。由於他們的返回值類型是不兼容的

函數重載

必定要使用function關鍵字來定義

雖然個人函數體定義的是any類型,仍是會實際的檢測出函數體的類型

傳入兩個number類型的數值,返回的就是number類型的

由於返回的是數字類型的,因此是沒有lenth屬性的,因此這裏就會報錯

 

他的類型實際上個接口,裏面有兩個函數重載

若是我這個是哦戶給func賦sum函數就會報錯,由於它缺乏一個函數重載的狀況。merge賦值給func以後,經過類型推論就會推斷出func有兩個函數重載,要包括這兩種狀況

這裏使用sum給func賦值的話,這個sum只包含一種函數重載,是缺乏一種狀況的,因此之類就會報錯,他倆是不兼容的。這個就是函數的兼容性

枚舉

數字枚舉類型和數字是互相兼容的

定義枚舉類型StatusInterface

s是枚舉類型StatusInterFace.On的值。

那麼我給s賦值爲1是能夠的

賦值爲2也是能夠的。由於它是數字類型的。它是和數值類型是兼容的,只要給它賦的值數值類型就能夠

給s賦值爲另一個枚舉的的值,雖然他們表示的都是0,可是這個地方是不兼容的。數字枚舉類型只與數字類型兼容。在不一樣枚舉值之間是不兼容的

 

類的兼容性

定義三個類

再定義三個變量制定類型分別是這三個類。people賦值給animal是沒有問題的

animal的類和people的類都有靜態屬性和構造函數,並animal的age類型是number類型。people的的age是string類型的

可是他們並不去監測類的靜態成員和構造函數,它只會去比較實例上的成員,animal和people的實例都經過public name給實例上添加了name屬性,並且類型都是stirng  ,因此這兩個類,類型是兼容的,因此把people複製給animal是沒有問題的

可是foodIsClass沒有靜態成員。,只有給實例上添加了一個name屬性,可是它的name是number類型的,雖然也是name可是類型是不兼容的,因此food複製給animal就會失敗。。這就是監測實例上的成員

private和protected

類的私有成員和受保護成員,這兩個修飾符修飾的成員會對兼容性形成影響,當檢查類的實例的兼容性時。  若是目標類型(要被賦值的那個值,就是建立這個實例的類的類。)若是這各種包含一個私有成員,那麼原類型(用來賦值的值)必須包含來自同一個類的這個私有成員

ParentClass和OtherClass是如出一轍的,除了類名不同

子類是能夠賦值給父類的類型的值的

指定類型是ParentClass,可是建立實例用的是OtherClass是不行的。

類型居右私有屬性「」age「」的單獨聲明

都換成protected也是同樣的道理

泛型的兼容性

泛型包含類型參數,能夠是任意類型,使用時類型參數會被制定爲一個特定的類型。而這個類型隻影響使用類型參數的部分

data1裏面只要用到類型的變量的地方都是number類型

data2裏面只要用到類型變量的地方都是string類型

data2賦值給data1是能夠的。明明傳進去的類型不同,爲何能夠賦值呢?由於接口Data<T>{}括號內什麼都沒有。因此這裏不論是傳number仍是stirng都是沒有影響的

能夠理解爲他倆能夠是一個空對象

若是在接口裏面定義實際的東西,定義data指定它的類型是T類型。如今賦值就不能夠了,

由於data1裏面要求它有一個data屬性,類型是number

data2裏面要求是stirng類型的

相關文章
相關標籤/搜索