最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Typescript中類(lèi)型兼容的實(shí)現(xiàn)

 更新時(shí)間:2023年12月29日 09:08:05   作者:新時(shí)代的弩力  
在TypeScript 編程中,類(lèi)型兼容是最基礎(chǔ)的一道檢查機(jī)制,一旦代碼中出現(xiàn)類(lèi)型不兼容的表達(dá)式,編譯就會(huì)失敗,本文主要介紹了Typescript中類(lèi)型兼容的實(shí)現(xiàn),感興趣的可以了解一下

typscript中的類(lèi)型兼容是基于結(jié)構(gòu)子類(lèi)型的(子類(lèi)型兼容和賦值兼容),即只使用其成員來(lái)判定是兼容,這是根據(jù)JavaScript的特性設(shè)計(jì)的,因?yàn)閖s中有很多匿名對(duì)象,只要y的所有成員都能在對(duì)象x中能找到,那么y=x就能成立,在強(qiáng)類(lèi)型語(yǔ)言如Java中就不行。

比較對(duì)象兼容

比如在一個(gè)interface和一個(gè)class,只要interface的變量p的成員都能在class或者一個(gè)匿名對(duì)象中能找到,那么就能把這個(gè)class實(shí)例或匿名對(duì)象賦值給p,如果是對(duì)象字面量會(huì)觸發(fā)嚴(yán)格檢查操作,需要將對(duì)象字面量賦值給一個(gè)變量y,再賦值給變量p

interface Named {
    name: string;
}

class Person {
    name: string;
}

let p:Named

p = new Person()
p = {name:'xxxx'}
// 此時(shí)會(huì)報(bào)錯(cuò) age 不兼容 Named,因?yàn)閷?duì)象字面量會(huì)觸發(fā)嚴(yán)格類(lèi)型檢查,可以通過(guò) as 斷言或者 中間變量y
p = {name:'xxxx',age:10}

在這里插入圖片描述

函數(shù)參數(shù)兼容

函數(shù)參數(shù)也是一樣,實(shí)參要兼容形參類(lèi)型

在這里插入圖片描述

兩個(gè)函數(shù)兼容性

參數(shù)列表數(shù)量

判斷函數(shù)x是否能賦值給函數(shù)y,一是從參數(shù)數(shù)量和參數(shù)類(lèi)型上,函數(shù)x參數(shù)數(shù)量少的,且對(duì)應(yīng)參數(shù)類(lèi)型兼容的能賦值給函數(shù) y

在這里插入圖片描述

函數(shù)返回值類(lèi)型,協(xié)變

一是從函數(shù)的返回值類(lèi)型上,函數(shù) x 的返回值類(lèi)型必須是函數(shù) y 的返回值類(lèi)型的子類(lèi),否則報(bào)錯(cuò)

在這里插入圖片描述

函數(shù)參數(shù)雙向協(xié)變(老版本ts)

函數(shù)的參數(shù)既能賦值父類(lèi)也能賦值子類(lèi)

函數(shù)參數(shù)逆變

當(dāng)函數(shù) x 的參數(shù)是 函數(shù) y 的參數(shù)的時(shí),函數(shù) x 也能賦值給 y ,因?yàn)楹瘮?shù) y 將來(lái)調(diào)用時(shí)傳入的時(shí)子類(lèi)如 Dog 類(lèi),那么如果此時(shí)用函數(shù) x 替換 函數(shù) y ,相當(dāng)于函數(shù) x 接收了 Dog 類(lèi),而函數(shù) x 的參數(shù)類(lèi)型時(shí) Animal 父類(lèi),那么也是兼容的。

interface Animal{
    name:string
}
interface Dog extends Animal{
    bark:()=>void
}

let x = (a:Animal)=>{}
let y = (d:Dog)=>{}

y = x // 函數(shù)參數(shù)逆變

x = y // 報(bào)錯(cuò)

// 因?yàn)榇嬖谶@種情況
function test(fn:(d:Dog)=>void){
    const dog = {name:'dog',bark(){}}

    fn(dog) // 當(dāng)傳入的fn是 (a:Animal)=>void 類(lèi)型時(shí),Animal類(lèi)也能接收Dog子類(lèi),所以逆變的意義就在于此
}

test(x)

枚舉與數(shù)字之間的兼容

enum Status { Ready, Waiting };
enum Color { Red, Blue, Green };

let s = Status.Ready;
s = 1 // enum 數(shù)字類(lèi)型兼容
s = Color.Green;  // Error

類(lèi)

類(lèi)和對(duì)象字面和接口差不多,主要區(qū)別在于類(lèi)具有靜態(tài)部分和實(shí)例部分,兩個(gè)類(lèi)實(shí)例對(duì)象之間能否賦值不在于其類(lèi)是否一直,這與Java等語(yǔ)言不同,A 類(lèi)和 B 類(lèi)的實(shí)例成員只要一致,那么就能相互賦值。但是類(lèi)的私有成員和受保護(hù)成員會(huì)影響兼容性,如果目標(biāo)類(lèi)型包含一個(gè)私有成員,那么源類(lèi)型必須包含來(lái)自同一個(gè)類(lèi)的這個(gè)私有成員。 同樣地,這條規(guī)則也適用于包含受保護(hù)成員實(shí)例的類(lèi)型檢查。 這允許子類(lèi)賦值給父類(lèi),但是不能賦值給其它有同樣類(lèi)型的類(lèi)。

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

泛型

泛型其實(shí)對(duì)于兼容性的影響在于影響其結(jié)果類(lèi)型,然后在結(jié)果類(lèi)型再去比較類(lèi)型兼容性
如下,經(jīng)過(guò)泛型推導(dǎo)后的類(lèi)型是{},那么 x , y 的類(lèi)型比較就是最終的類(lèi)型比較

interface Empty<T> {
}
let x: Empty<number>;
let y: Empty<string>;

x = y;  // OK, because y matches structure of x

到此這篇關(guān)于Typescript中類(lèi)型兼容的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Typescript 類(lèi)型兼容內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

最新評(píng)論

奉化市| 鄂托克前旗| 阿拉善左旗| 鹰潭市| 葫芦岛市| 贡山| 安龙县| 边坝县| 三门峡市| 广宗县| 永昌县| 山东省| 集安市| 大姚县| 泰宁县| 揭东县| 贵德县| 通城县| 陕西省| 崇左市| 安康市| 龙江县| 封丘县| 马龙县| 龙里县| 新泰市| 长阳| 乳山市| 湖北省| 商水县| 连江县| 南雄市| 大邑县| 日土县| 彰化县| 瓦房店市| 汤阴县| 汉川市| 界首市| 青浦区| 辽阳市|