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

詳解Typescript中奇怪的賦值操作

 更新時(shí)間:2024年02月19日 15:45:09   作者:不如吃茶去  
這篇文章主要來和大家討論一下typescript中一些奇怪的賦值語句,探索其背后原因,更深入的了解typescript作為一個(gè)結(jié)構(gòu)化系統(tǒng)的特性,感興趣的可以了解下

前言

本文主要討論在typescript中一些奇怪的賦值語句,探索其背后原因,更深入的了解typescript作為一個(gè)結(jié)構(gòu)化系統(tǒng)的特性。

我們先看這樣一個(gè)例子:

// 定義一個(gè)Cat類
class Cat {
  name!: string
  age!: number
?
  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }
}
// 定義一個(gè)Dog接口類型
interface Dog {
  name: string
  age: number
}
?
let dog: Dog = {
  name: 'wuyue',
  age: 3
}
?
let cat: Cat
cat = new Cat('qiqi', 2)
cat = dog // is ok 
dog = cat // is ok 
cat = { name: 'jack', age: 12 } // is ok
  • 在上面的例子中,我們定義了一個(gè)Cat類,一個(gè)Dog接口類型, Cat類的實(shí)例對象與Dog類型的變量相互賦值,可以通過Typescript的類型檢查,而將{ name: 'jack', age: 12 }分配給一個(gè)Cat類型的變量也是可以的。
  • 這是結(jié)構(gòu)化類型系統(tǒng)的特性,Typescript就采用了這種結(jié)構(gòu)類型。結(jié)構(gòu)化類型系統(tǒng)的思想在于,名稱不重要,重要的是它們是否具有類型的相同成員,如果是則是兼容的。 結(jié)構(gòu)化類型系統(tǒng)也叫鴨子類型, 如果你看到一只鳥走起來像鴨子,游泳像鴨子,叫得也像鴨子,那么這只鳥就是鴨子。
  • 上個(gè)例子中cat變量,dog變量,以及{ name: 'jack', age: 12 } 字面量他們都具有相同的結(jié)構(gòu),所以Typescript在類型檢查時(shí)認(rèn)為他們之間的賦值操作是合法的。

我們再來看另一個(gè)例子

// 定義一個(gè)Cat類
class Cat {
  name!: string
  age!: number
?
  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }
}
// 定義一個(gè)Dog接口類型
interface Dog {
  name: string
  age: number
}
let dog: Dog = {
  name: 'wuyue',
  age: 3
}
?
function getCat(cat: Cat) {}
?
getCat(new Cat('cc', 2)) // ok
getCat(dog) // ok
getCat({ name: 'jack', age: 12 }) // ok
const obj = { name: 'jack', age: 12, sex: 1 } // ok
getCat(obj) // ? ok

在這個(gè)例子中,我們定義的Cat類和Dog接口類型和上面的例子一致,緊接著我們定義了一個(gè)getCat的函數(shù),接受一個(gè)Cat類型的形參。

根據(jù)上一個(gè)例子中我們學(xué)到的結(jié)構(gòu)化類型系統(tǒng)的知識,可以很快的判斷出來 new Cat('cc', 2)、dog{ name: 'jack', age: 12 } 都可以分配給Cat類型的變量,那么最后一個(gè)可以嗎? 我們在 typescript Playground中測試發(fā)現(xiàn)是可以的,typescript對上面的代碼都通過了類型檢查,但是你可能還有困惑,obj明顯多了一個(gè)sex屬性,而sex屬性在Cat類型中并不存在,Typescript為什么也對其通過了類型檢查?先放下這個(gè)疑問,我們在看這么一行代碼

getCat({ name: 'jack', age: 12, sex: 1 }) 

這行代碼竟然報(bào)錯(cuò)了,事情變得更加奇怪了。

再來看一個(gè)例子:

是不是很奇怪,同樣的值,直接賦值/傳參會報(bào)錯(cuò),如果先定義一個(gè)變量然后將這個(gè)變量進(jìn)行賦值/傳參就不會報(bào)錯(cuò)。

通過查閱各種官方資料發(fā)現(xiàn)這么一個(gè)結(jié)論: 在typescript類型系統(tǒng)中,對對象進(jìn)行類型檢查時(shí)定義的方式會對結(jié)果產(chǎn)生影響,在創(chuàng)建一個(gè)對象字面量并直接分配給具有某個(gè)類型的變量時(shí),typescript會最嚴(yán)謹(jǐn)?shù)尿?yàn)證對象, 進(jìn)行嚴(yán)格的屬性檢查(ECP),而當(dāng)將對象變量分配給另一個(gè)變量,對這個(gè)變量進(jìn)行類型檢查時(shí),typescript會進(jìn)行兼容性判斷,如果兼容則通過檢查,如果不兼容則報(bào)錯(cuò)。

而這個(gè)兼容性判斷是如何判斷的呢? 請記住下面這句話:

假如x要分配給y,在TypeScript中,X需要更具體,即X要有和Y相同的屬性或者更多。 可分配性指的就是兼容性。

如: let v = { name: 'john'; age: 20 } 兼容{ name: string }, 類型兼容,通過檢查。let v = {foo: 1, bar: 2} 兼容{foo: number} , 類型兼容,通過檢查。而這個(gè)問題可以被看成是類型加寬。

對于上面的現(xiàn)象,有好處也有壞處,對此有人提出來typescript新加入一個(gè)精確類型的語法,引起了激烈的討論:可以看下面這個(gè)鏈接。 #12936

結(jié)尾

在網(wǎng)上大多數(shù)的案例中,總是會出現(xiàn)這樣的例子:

interface Person {
  name: string
  age: number
}

let p: Person = {
  name: 'jack',
  age: 12,
}

我們似乎認(rèn)為p變量一定要精確的滿足于Person的定義,如果多加了屬性那么就會報(bào)錯(cuò),這是typescript的基石,ts就應(yīng)該做這樣的事,其實(shí)不然,typescript作為一個(gè)結(jié)構(gòu)化系統(tǒng),多加了屬性并不會報(bào)錯(cuò), “多加了屬性那么就會報(bào)錯(cuò)” 的功能其實(shí)是在typescript中是一種linter校驗(yàn)的功能,而且它僅適用于對象字面量。所以有時(shí)候我們也會說Typescript是Javascript一個(gè)超級強(qiáng)大的linter工具。

到此這篇關(guān)于詳解Typescript中奇怪的賦值操作的文章就介紹到這了,更多相關(guān)Typescript賦值操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 前端開發(fā)之CSS原理詳解

    前端開發(fā)之CSS原理詳解

    這篇文章主要介紹了前端開發(fā)之CSS原理詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 使用JavaScript平移和縮放圖像的示例代碼

    使用JavaScript平移和縮放圖像的示例代碼

    平移和縮放是查看圖像時(shí)常用的功能,我們可以放大圖像以查看更多細(xì)節(jié),進(jìn)行圖像編輯,Dynamsoft Document Viewer是一個(gè)用于此目的的SDK,它為文檔圖像提供了一組查看器,在本文中,我們將演示如何使用它來平移和縮放圖像,需要的朋友可以參考下
    2024-08-08
  • 用js判斷頁面刷新或關(guān)閉的方法(onbeforeunload與onunload事件)

    用js判斷頁面刷新或關(guān)閉的方法(onbeforeunload與onunload事件)

    Onunload,onbeforeunload都是在刷新或關(guān)閉時(shí)調(diào)用,可以在<script>腳本中通過window.onunload來指定或者在<body>里指定
    2012-06-06
  • JavaScript模擬實(shí)現(xiàn)"雙11"限時(shí)秒殺效果

    JavaScript模擬實(shí)現(xiàn)"雙11"限時(shí)秒殺效果

    每年的“雙11”啊,都是大家的剁手節(jié)。大家都在晚上12點(diǎn),捧著手機(jī)看著倒計(jì)時(shí),在他倒數(shù)到0的時(shí)候瘋狂點(diǎn)擊下單??墒悄阌袥]想過限時(shí)秒殺是怎么實(shí)現(xiàn)的呢?本文將為你揭秘如何用JavaScript實(shí)現(xiàn)限時(shí)秒殺,快來了解一下吧
    2022-03-03
  • 使用JavaScript?+?HTML5?Canvas實(shí)現(xiàn)互動愛心雨完整代碼

    使用JavaScript?+?HTML5?Canvas實(shí)現(xiàn)互動愛心雨完整代碼

    canvas是HTML5中推出的新功能,可以在頁面上生成一個(gè)畫布,使用js可以在畫布上繪制一些圖形,這篇文章主要介紹了使用JavaScript?+?HTML5?Canvas實(shí)現(xiàn)互動愛心雨的相關(guān)資料,需要的朋友可以參考下
    2025-03-03
  • JS使用setInterval實(shí)現(xiàn)的簡單計(jì)時(shí)器功能示例

    JS使用setInterval實(shí)現(xiàn)的簡單計(jì)時(shí)器功能示例

    這篇文章主要介紹了JS使用setInterval實(shí)現(xiàn)的簡單計(jì)時(shí)器功能,涉及javascript基于setInterval的定時(shí)觸發(fā)與數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • JavaScript解決Joseph問題

    JavaScript解決Joseph問題

    JavaScript解決Joseph問題...
    2007-02-02
  • JavaScript防抖案例講解

    JavaScript防抖案例講解

    這篇文章主要介紹了JavaScript防抖案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Code Review 方法論與實(shí)踐總結(jié)梳理

    Code Review 方法論與實(shí)踐總結(jié)梳理

    這篇文章主要為大家介紹了Code Review 方法論與實(shí)踐總結(jié)梳理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • ES6頂層對象、global對象實(shí)例分析

    ES6頂層對象、global對象實(shí)例分析

    這篇文章主要介紹了ES6頂層對象、global對象,結(jié)合實(shí)例形式分析了ES6頂層對象與global對象的概念、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-06-06

最新評論

泊头市| 滦南县| 大英县| 会同县| 石河子市| 平阴县| 巴青县| 竹北市| 安达市| 宁乡县| 新乡市| 田林县| 连平县| 凤冈县| 南川市| 蓝山县| 石首市| 新乡市| 桐庐县| 永新县| 兴国县| 钦州市| 莲花县| 随州市| 通河县| 宽甸| 定边县| 大方县| 原阳县| 德兴市| 松阳县| 丹东市| 墨竹工卡县| 梁山县| 安国市| 新平| 万源市| 武义县| 磴口县| 临漳县| 云安县|