Typescript中類型兼容的實現(xiàn)
typscript
中的類型兼容是基于結(jié)構(gòu)子類型的(子類型兼容和賦值兼容),即只使用其成員來判定是兼容,這是根據(jù)JavaScript
的特性設(shè)計的,因為js中有很多匿名對象,只要y
的所有成員都能在對象x
中能找到,那么y=x
就能成立,在強類型語言如Java
中就不行。
比較對象兼容
比如在一個interface
和一個class
,只要interface
的變量p
的成員都能在class
或者一個匿名對象中能找到,那么就能把這個class
實例或匿名對象賦值給p
,如果是對象字面量會觸發(fā)嚴格檢查操作,需要將對象字面量賦值給一個變量y
,再賦值給變量p
interface Named { name: string; } class Person { name: string; } let p:Named p = new Person() p = {name:'xxxx'} // 此時會報錯 age 不兼容 Named,因為對象字面量會觸發(fā)嚴格類型檢查,可以通過 as 斷言或者 中間變量y p = {name:'xxxx',age:10}
函數(shù)參數(shù)兼容
函數(shù)參數(shù)也是一樣,實參要兼容形參類型
兩個函數(shù)兼容性
參數(shù)列表數(shù)量
判斷函數(shù)x
是否能賦值給函數(shù)y
,一是從參數(shù)數(shù)量和參數(shù)類型上,函數(shù)x
參數(shù)數(shù)量少的,且對應(yīng)參數(shù)類型兼容的能賦值給函數(shù) y
函數(shù)返回值類型,協(xié)變
一是從函數(shù)的返回值類型上,函數(shù) x 的返回值類型必須是函數(shù) y 的返回值類型的子類,否則報錯
函數(shù)參數(shù)雙向協(xié)變(老版本ts)
函數(shù)的參數(shù)既能賦值父類也能賦值子類
函數(shù)參數(shù)逆變
當函數(shù) x 的參數(shù)是 函數(shù) y 的參數(shù)的時,函數(shù) x 也能賦值給 y ,因為函數(shù) y 將來調(diào)用時傳入的時子類如 Dog 類,那么如果此時用函數(shù) x 替換 函數(shù) y ,相當于函數(shù) x 接收了 Dog 類,而函數(shù) x 的參數(shù)類型時 Animal 父類,那么也是兼容的。
interface Animal{ name:string } interface Dog extends Animal{ bark:()=>void } let x = (a:Animal)=>{} let y = (d:Dog)=>{} y = x // 函數(shù)參數(shù)逆變 x = y // 報錯 // 因為存在這種情況 function test(fn:(d:Dog)=>void){ const dog = {name:'dog',bark(){}} fn(dog) // 當傳入的fn是 (a:Animal)=>void 類型時,Animal類也能接收Dog子類,所以逆變的意義就在于此 } test(x)
枚舉與數(shù)字之間的兼容
enum Status { Ready, Waiting }; enum Color { Red, Blue, Green }; let s = Status.Ready; s = 1 // enum 數(shù)字類型兼容 s = Color.Green; // Error
類
類和對象字面和接口差不多,主要區(qū)別在于類具有靜態(tài)部分和實例部分,兩個類實例對象之間能否賦值不在于其類是否一直,這與Java
等語言不同,A 類和 B 類的實例成員只要一致,那么就能相互賦值。但是類的私有成員和受保護成員會影響兼容性,如果目標類型包含一個私有成員,那么源類型必須包含來自同一個類的這個私有成員。 同樣地,這條規(guī)則也適用于包含受保護成員實例的類型檢查。 這允許子類賦值給父類,但是不能賦值給其它有同樣類型的類。
class Animal { feet: number=0; constructor(name: string, numFeet: number) { } } class Size { feet: number=0; constructor(numFeet: number) { } } let a: Animal = new Animal('',0) let s: Size = new Size(0); a = s; // OK s = a; // OK
泛型
泛型其實對于兼容性的影響在于影響其結(jié)果類型,然后在結(jié)果類型再去比較類型兼容性
如下,經(jīng)過泛型推導(dǎo)后的類型是{},那么 x , y 的類型比較就是最終的類型比較
interface Empty<T> { } let x: Empty<number>; let y: Empty<string>; x = y; // OK, because y matches structure of x
到此這篇關(guān)于Typescript中類型兼容的實現(xiàn)的文章就介紹到這了,更多相關(guān)Typescript 類型兼容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解WordPress開發(fā)中g(shù)et_current_screen()函數(shù)的使用
這篇文章主要介紹了WordPress開發(fā)中g(shù)et_current_screen()函數(shù)的使用,get_current_screen()通常在對象的實例化時使用,需要的朋友可以參考下2016-01-01純前端使用ffmpeg實現(xiàn)視頻壓縮的具體方法及踩坑
這篇文章主要給大家介紹了關(guān)于純前端使用ffmpeg實現(xiàn)視頻壓縮的具體方法及踩坑,要在前端使用FFmpeg進行視頻壓縮,你可以使用FFmpeg的JavaScript,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-12-12