日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

TypeScript 中的 Extends 怎么那么優(yōu)秀啊?

來源: 責編: 時間:2024-05-07 09:11:49 223觀看
導讀在學習和使用 ts 的時候,有一個語法會大量的出現(xiàn),他就是 extends。但是這個語法放到 ts 里,就顯得非常怪異,因為好多時候跟我們常規(guī)的理解看上去好像不太一樣,不就是一個繼承嗎,咋到處都在亂用啊?實際上,之所以怪,是因為在 ts

CNW28資訊網(wǎng)——每日最新資訊28at.com

在學習和使用 ts 的時候,有一個語法會大量的出現(xiàn),他就是 extends。但是這個語法放到 ts 里,就顯得非常怪異,因為好多時候跟我們常規(guī)的理解看上去好像不太一樣,不就是一個繼承嗎,咋到處都在亂用啊?CNW28資訊網(wǎng)——每日最新資訊28at.com

實際上,之所以怪,是因為在 ts 中,extends 不只是要表達繼承的意思,他還有一些延展含義。CNW28資訊網(wǎng)——每日最新資訊28at.com

在 JS 核心進階中,我們在學習設計模式的時候,曾經(jīng)提高過一個原則:里氏替換原則,該原則針對的是父類與子類之間的替換關系:任何使用父類實例的地方,都能夠使用子類實例完美替換。CNW28資訊網(wǎng)——每日最新資訊28at.com

class Person {  constructor(name) {    this.name = name  }  run(t) {    console.log(`${this.name} 跑了 ${t} 公里`);  }}class Student extends Person {  constructor(name, grade) {    super(name)    this.grade = grade  }}const p1 = new Person('Tom')p1.run(20)const s1 = new Student('Tom')s1.run(20)

這個案例中,我們能夠使用 s1 去替換 p1。而不會出現(xiàn)什么問題。CNW28資訊網(wǎng)——每日最新資訊28at.com

在 ts 的類型兼容性里,也符合這個原則。基于這個邏輯,我們就可以把 extends 作為一個判斷條件,來驗證你是否合理運用了里氏替換原則,從而衍生出它新的用法。CNW28資訊網(wǎng)——每日最新資訊28at.com

一、繼承

繼承的運用非常的常規(guī)。在面向?qū)ο蟮倪\用中,我們可以繼承一個父類。CNW28資訊網(wǎng)——每日最新資訊28at.com

class Parent {}class Children extends Parent {}

我們也可以在 interface 的類型聲明中,使用繼承。CNW28資訊網(wǎng)——每日最新資訊28at.com

interface Animal {  kind: string}interface Dog extends Animal {  bark(): void}

它等價于。CNW28資訊網(wǎng)——每日最新資訊28at.com

interface Dog {  kind: string  bark(): void}

二、泛型約束

我們先簡單來看一下這個東西是如何在泛型中使用的,然后再來結(jié)合里氏替換原則來分析它的邏輯。CNW28資訊網(wǎng)——每日最新資訊28at.com

interface Dispatch<T extends { type: string }> {  (action: T): T}

我們在定義 Dispatch 時需要傳入一個泛型,傳入的泛型類型必須與 {type: string} 符合里氏替換原則。意思就是說,要傳入該類型的子類型。CNW28資訊網(wǎng)——每日最新資訊28at.com

因此,我們可以傳入。CNW28資訊網(wǎng)——每日最新資訊28at.com

var action = {  type: 'get/list',  playload: 10}

也可以傳入。CNW28資訊網(wǎng)——每日最新資訊28at.com

var action = {  type: 'merge'}
var action = {  type: 'add',  value: { a: 1, b: 2 }}

從結(jié)論上來看,父類型的約束力度更小,子類型的約束力度更大。CNW28資訊網(wǎng)——每日最新資訊28at.com

三、條件判斷

我們可以可以繼續(xù)衍生,當子類型與父類型符合正常的繼承關系時,判斷結(jié)果為 true,否則為 false。CNW28資訊網(wǎng)——每日最新資訊28at.com

這里的繼承關系,表達的是一種替換關系,或者說是約束力度的縮小。CNW28資訊網(wǎng)——每日最新資訊28at.com

type C = A extends B ? string : number

這里表達的含義是,當 A 能夠替換 B 時,判斷結(jié)果為 true,否則,判斷結(jié)果為 false。CNW28資訊網(wǎng)——每日最新資訊28at.com

interface Person {  name: string}interface Yung extends Person {  gender: string}interface Student extends Yung {  age: string}

也就是說,當 A 作為 B 的子類型時,判斷結(jié)果為 true。CNW28資訊網(wǎng)——每日最新資訊28at.com

// 此時判斷結(jié)果為truetype C = Yung extends Person ? number : string // number
// 此時判斷結(jié)果為falsetype C = Yung extends Student ? number : string // string

也可以結(jié)合泛型使用。CNW28資訊網(wǎng)——每日最新資訊28at.com

type P<T> = T extends string ? string : numbertype Z = P<string> // string

當我們在使用泛型的時候,會出現(xiàn)一些問題,看一下這個例子。CNW28資訊網(wǎng)——每日最新資訊28at.com

type A = number | string extends string ? string : number // number

因為 string 的約束力度,比 number | string 更大,因此這里的條件判斷為 false,但是當我們通過泛型來做到同樣的事情時,情況就發(fā)生了變化。CNW28資訊網(wǎng)——每日最新資訊28at.com

type P<T> = T extends string ? string : numbertype A = P<number | string> // string | number

當我們用泛型傳遞時候,跟預想中的不太一樣,這里會把泛型傳入的 number 和 string 拆分之后在去運行 extends 判斷。因此最后的結(jié)果是 string | number。CNW28資訊網(wǎng)——每日最新資訊28at.com

聯(lián)合類型在泛型中的表現(xiàn)是分配之后再傳入。CNW28資訊網(wǎng)——每日最新資訊28at.com

在實踐中一定要警惕這個小小的差異。我們可以使用如下的方式避免這種先分配再傳入的規(guī)則。CNW28資訊網(wǎng)——每日最新資訊28at.com

type P<T> = [T] extends [string] ? string : numbertype A = P<number | string> // number

never 表示所有類型的子類型,因此也被看成是一個聯(lián)合類型,當我們在泛型中傳入 never 時也會同理出現(xiàn)同樣的問題。CNW28資訊網(wǎng)——每日最新資訊28at.com

type P<T> = T extends string ? string : number// 沒有類型可分配,直接返回 nevertype A = P<never> // never

注意他們的不同。CNW28資訊網(wǎng)——每日最新資訊28at.com

type P<T> = [T] extends [string] ? string : numbertype A = P<never> // string

四、定義一個 pick

現(xiàn)有一個對象 A 有很多個屬性,我希望重新定義一個新的對象 B,該對象的屬性是從 A 里挑選出來的,那么 B 的類型應該怎么定義呢。CNW28資訊網(wǎng)——每日最新資訊28at.com

interface A {  name: string;  age: number;  gender: number;  class: string}

當然,我們可以用常規(guī)的方式來定義,不過有的時候這樣會比較麻煩。CNW28資訊網(wǎng)——每日最新資訊28at.com

interface B {  name: string,  age: number}

我們也可以利用泛型和 extends,定義一個 Pick 類型。CNW28資訊網(wǎng)——每日最新資訊28at.com

type Pick<T, K extends keyof T> = {  [P in K]: T[P]}type B = Pick<A, 'name' | 'age'>

當我們在 Pick 中傳入 A 時, keyof A 的結(jié)果為 name | age | gender | class,因此 'name' | 'age' 是 keyof A 的子類型。CNW28資訊網(wǎng)——每日最新資訊28at.com

此時的 B 得到與上面寫法一樣的結(jié)果。CNW28資訊網(wǎng)——每日最新資訊28at.com

五、定義一個 Exclude

現(xiàn)在我有一個聯(lián)合類型。CNW28資訊網(wǎng)——每日最新資訊28at.com

type a = 'name' | 'age' | 'gender' | 'class'

我希望排除其中一個 name,得到一個新的聯(lián)合類型。CNW28資訊網(wǎng)——每日最新資訊28at.com

type b = 'age' | 'gender' | 'class'

此時我們可以定一個排除的泛型類型來做到這個事情。CNW28資訊網(wǎng)——每日最新資訊28at.com

type b = Exclude<a, 'name'>

這個 Exclude 是如何實現(xiàn)的呢?非常的簡單。CNW28資訊網(wǎng)——每日最新資訊28at.com

type Exclude<T, U> = T extends U ? never : Ttype b = Exclude<a, 'name'>

我們來分析一下,首先剛才我們已經(jīng)知道,當傳入的泛型為聯(lián)合類型時,會先分配再傳入。CNW28資訊網(wǎng)——每日最新資訊28at.com

因此,此時傳入的聯(lián)合類型 a 會被拆分傳入。CNW28資訊網(wǎng)——每日最新資訊28at.com

也就是說,T exnteds U 的比較會變成。CNW28資訊網(wǎng)——每日最新資訊28at.com

// never'name' extends 'name' ? never : 'name'// age'age' extends 'name' ? never : 'age'// gender'gender' extends 'name' ? never : 'gender'// class'class' extends 'name' ? never : 'class'

所以通過這種方式,我們可以做到從聯(lián)合類型中排除指定的類型。CNW28資訊網(wǎng)——每日最新資訊28at.com

六、定義一個 Omit

Omit 是 Pick 的取反,表示挑選剩余的屬性組成新的對象。理解了 Pick 和 Exclude,這個理解起來非常容易。CNW28資訊網(wǎng)——每日最新資訊28at.com

type Omit<T, K> = Pick<T, Exclude<keyof T, K>>

使用:CNW28資訊網(wǎng)——每日最新資訊28at.com

interface A {  name: string,  age: number,  gender: number,  class: string}type B = Omit<A, 'name'>

等價于:CNW28資訊網(wǎng)——每日最新資訊28at.com

interface A {  age: number,  gender: number,  class: string}

大家可以自己分析一下 Omit 的實現(xiàn)原理,應該是沒有任何難度的。CNW28資訊網(wǎng)——每日最新資訊28at.com

七、最后

最后來個騷的,大家分析一下這玩意兒有什么用CNW28資訊網(wǎng)——每日最新資訊28at.com

type TypeString<T> =    T extends string ? "string" :    T extends number ? "number" :    T extends boolean ? "boolean" :    T extends undefined ? "undefined" :    T extends Function ? "function" :    "object";

本文鏈接:http://m.www897cc.com/showinfo-26-87003-0.htmlTypeScript 中的 Extends 怎么那么優(yōu)秀啊?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 逆向之旅:七個讓Python編程更糟糕的小技

下一篇: Fo-dicom,第一個基于.NET Standard 2.0 開發(fā)的DICOM開源庫

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
激情欧美丁香| 国产精品永久免费| 久久综合免费视频影院| 久久这里只有| 欧美日产国产成人免费图片| 欧美日韩一区精品| 国产色视频一区| 在线观看日韩| 一本色道久久加勒比88综合| 亚洲亚洲精品三区日韩精品在线视频| 亚洲尤物视频在线| 久久亚洲视频| 欧美日韩高清在线| 国产亚洲一级| 日韩视频免费在线观看| 欧美一区二区啪啪| 男人的天堂亚洲| 欧美丝袜第一区| 黄色成人在线免费| 亚洲五月六月| 麻豆精品一区二区av白丝在线| 欧美日韩午夜视频在线观看| 国产日本欧美视频| 日韩视频一区二区| 久久久久国产精品一区| 欧美日韩一区高清| 原创国产精品91| 亚洲资源在线观看| 欧美大片免费观看| 国产欧美一区二区精品性| 亚洲激情成人| 久久成人资源| 欧美日韩影院| 亚洲第一黄色| 欧美一区二视频在线免费观看| 欧美精品乱码久久久久久按摩| 国产一区二区日韩精品| 宅男噜噜噜66一区二区| 美女在线一区二区| 国产亚洲欧美一级| 正在播放亚洲| 欧美成人免费一级人片100| 国产日韩欧美在线视频观看| 一区二区三区高清在线| 老鸭窝毛片一区二区三区| 国产精品网站在线播放| 日韩亚洲成人av在线| 久久蜜桃精品| 国产日韩在线一区| 亚洲一二三区在线观看| 欧美好吊妞视频| 狠狠色狠狠色综合日日五| 亚洲影视在线| 欧美人与禽猛交乱配视频| 在线观看视频日韩| 欧美怡红院视频一区二区三区| 欧美性大战久久久久久久| 亚洲精品国产品国语在线app| 久久免费高清视频| 国产视频一区三区| 亚洲欧美国产日韩中文字幕| 欧美日韩中文| 99精品国产在热久久婷婷| 美女视频黄a大片欧美| 黄色亚洲网站| 久久成人精品视频| 国产午夜精品一区理论片飘花| 亚洲一区二区三区在线| 欧美视频中文字幕在线| 亚洲最黄网站| 欧美日韩国产在线播放网站| 亚洲精品美女在线观看| 欧美国产精品日韩| 91久久线看在观草草青青| 蜜桃久久av一区| 在线观看视频一区二区| 麻豆精品一区二区综合av| 激情成人综合网| 久久久免费观看视频| 国产综合久久久久久鬼色| 欧美自拍偷拍| 国产一区二区视频在线观看| 欧美一级淫片aaaaaaa视频| 国产精品一区二区三区免费观看| 亚洲综合二区| 国产精品一区二区三区四区五区| 亚洲欧美福利一区二区| 国产精品午夜久久| 欧美一区二视频| 国内精品久久久久久久影视蜜臀| 久久精品国产清自在天天线| 国外成人在线视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲第一毛片| 欧美福利视频一区| 99精品欧美一区二区三区 | 久久久久久久网站| 一区二区视频免费在线观看| 久久尤物视频| 91久久综合亚洲鲁鲁五月天| 欧美日韩美女一区二区| 亚洲一区二区精品视频| 国产美女精品一区二区三区| 久久福利一区| 亚洲大胆在线| 欧美日韩亚洲国产精品| 亚洲特级毛片| 国产在线播放一区二区三区| 你懂的视频一区二区| 99国产麻豆精品| 国产精品欧美日韩一区二区| 久久国产免费| 91久久中文字幕| 欧美午夜a级限制福利片| 亚洲欧美在线高清| 精品成人在线| 欧美日韩精品免费观看| 午夜精品福利一区二区三区av | 极品少妇一区二区| 欧美肥婆bbw| 亚洲免费伊人电影在线观看av| 国产一区二区三区免费观看| 欧美96在线丨欧| 亚洲午夜国产一区99re久久 | 亚洲国产一区二区三区a毛片| 欧美日韩一区二区免费视频| 欧美与欧洲交xxxx免费观看 | 久久天天狠狠| 一本色道久久综合狠狠躁篇的优点 | 国产精品手机视频| 老司机午夜精品| 亚洲一级免费视频| 精品999久久久| 欧美婷婷六月丁香综合色| 欧美在线免费视屏| 亚洲人成亚洲人成在线观看| 国产精品视区| 欧美成人亚洲| 欧美夜福利tv在线| 亚洲精品日韩激情在线电影| 国产欧美日韩综合| 欧美理论电影网| 久久久精品一区| 国产精品99久久久久久www| 韩国自拍一区| 欧美午夜在线一二页| 毛片av中文字幕一区二区| 亚洲一品av免费观看| 亚洲福利视频二区| 国产免费成人在线视频| 欧美激情在线狂野欧美精品| 欧美影视一区| 亚洲一区二区av电影| 亚洲国产va精品久久久不卡综合| 国产精品美女999| 欧美激情一区| 久久久一二三| 欧美亚洲一区| 日韩一区二区精品| 在线观看不卡| 国产欧美一区二区精品忘忧草| 欧美国产综合视频| 久久久久欧美| 午夜在线电影亚洲一区| 一本久久a久久免费精品不卡| 亚洲成人影音| 国产一区二区三区直播精品电影 | 亚洲福利视频在线| 国内精品嫩模av私拍在线观看 | 欧美精品aa| 欧美在线不卡| 久久久久久久999精品视频| 欧美国产欧美亚洲国产日韩mv天天看完整 | 国产农村妇女精品一二区| 久久国产66| 亚洲一区综合| 日韩亚洲不卡在线| 亚洲人成在线观看| 国产一区二区三区久久久| 欧美成人综合在线| 久久精品99国产精品日本| 伊人成人在线视频| 六月天综合网| 亚洲第一福利社区| 久久综合五月天婷婷伊人| 一区二区亚洲精品国产| 欧美日韩亚洲系列| 久久精品女人的天堂av| 亚洲最新合集| 黄色一区二区在线观看| 国产精品igao视频网网址不卡日韩| 久久大逼视频| 亚洲精品在线免费| 国内欧美视频一区二区| 欧美黄色免费| 欧美在线视频在线播放完整版免费观看| 国内精品福利| 久久精品国产99精品国产亚洲性色| 激情综合自拍| 樱桃成人精品视频在线播放| 国产欧美一区在线| 国产日本欧美一区二区| 国产亚洲欧美一区二区三区| 亚洲丶国产丶欧美一区二区三区|