成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

分享幾個(gè)TypeScript泛型的使用場景

騫諱護(hù) / 2573人閱讀

摘要:最近使用寫了一個(gè)項(xiàng)目過程中不斷感受到的魅力現(xiàn)在來分享幾個(gè)業(yè)務(wù)中關(guān)于泛型的場景深度內(nèi)置了一個(gè)類型用于把一個(gè)類型的成員屬性設(shè)置為成可選模式例如類型中有兩個(gè)成員屬性如果我們要把這個(gè)類型賦予變量那必須擁有和兩個(gè)屬性現(xiàn)在我們要讓的兩個(gè)屬性都變?yōu)榭蛇x可

最近使用TypeScript寫了一個(gè)項(xiàng)目,過程中不斷感受到TypeScript的魅力,現(xiàn)在來分享幾個(gè)業(yè)務(wù)中關(guān)于泛型的場景

1. 深度Partial

TS內(nèi)置了一個(gè)Partial類型,用于把一個(gè)類型的成員屬性設(shè)置為成可選模式,例如

type Person = {
  name: string;
  age: number;
}

Person類型中有兩個(gè)成員屬性,如果我們要把這個(gè)類型賦予變量tom,那tom必須擁有nameage兩個(gè)屬性

let tom:Person = {
    name: "tom",
    age: 20
};

現(xiàn)在我們要讓Person的兩個(gè)屬性都變?yōu)榭蛇x,可以使用Partial類型進(jìn)行轉(zhuǎn)換

type PartialPerson = Partial;

let partialPerson: PartialPerson = {
  name: "tom"
};

這時(shí)PartialPersonnameage屬性都已經(jīng)變?yōu)榭蛇x的了,但是如果我們在Person中再加一點(diǎn)東西

type Person = {
  name: string;
  age: number;
  contact: {
    email: string;
    phone: number;
    wechat: string;
  }
}

現(xiàn)在我們加入了一個(gè)contact屬性值是一個(gè)對象,如果我們想把contact里面的屬性也變?yōu)榭蛇xPartial就不靈了

可以看到Partial是把contact變成了可選而不是里面的屬性,插個(gè)題外話通常的做法是為contact另外創(chuàng)建一個(gè)類型,如果是這樣的話Partial就可以用了,但是我們不使用這種方法,我們先來看看TS是怎么定義Partial

/**
 * Make all properties in T optional
 */
type Partial = {
    [P in keyof T]?: T[P];
};

很容易理解關(guān)鍵點(diǎn)是在?:上,現(xiàn)在我們改造一下

type DeepPartial = {
  [P in keyof T]?: T[P] extends Object ? DeepPartial : T[P];
}

可以看到改造的DeepPartialPartial差別在把直接賦值T[P]換成了T[P] extends Object ? DeepPartial : T[P], 即判斷T的屬性P的類型是否是Object然后進(jìn)行再次DeepPartial或者返回T[P]的類型


這時(shí)編譯器就不會再提示錯(cuò)誤了

2. 更智能的array_column函數(shù)

在PHP中有一個(gè)array_column函數(shù),用于在數(shù)組中提取一列的內(nèi)容,用JavaScript表現(xiàn)就是

function array_column(arr, key) {
  return arr.map(item => item[key])
}

假如現(xiàn)在有一個(gè)persons數(shù)組

type Person = {
  name: string;
  age: number;
}

let persons: Person[] = [];

我們需要提取數(shù)組中的name屬性,可以很方便的使用Array.map方法提取,但是如果又有別的數(shù)組需要提取,我們可以實(shí)現(xiàn)一個(gè)更優(yōu)雅的array_column函數(shù)

function array_column(input: T[], key: K) {
  return input.map(item => item[key])
}

現(xiàn)在我們使用這個(gè)函數(shù)提取persons數(shù)組


可以看到當(dāng)我們輸入persons時(shí),編輯器已經(jīng)推斷出了key的類型,再來一個(gè)animals數(shù)組

3. Proxy

在剛開始學(xué)習(xí)TS的時(shí)候看官方文檔有一個(gè)Proxy的例子,只給出了類型聲明但卻沒有給出實(shí)現(xiàn),當(dāng)時(shí)花了不少時(shí)間琢磨,現(xiàn)在來實(shí)現(xiàn)它

class Proxy{
  constructor(private data: T) { }

  get(key: K) {
    return this.data[key]
  }

  set(key: K, value: V) {
    this.data[key] = value;
  }
}

可以看到Proxy類提供了getter方法getsetter方法set,現(xiàn)在我們基于上面的Person類型創(chuàng)建一個(gè)Proxy實(shí)例

let person: Person = {
  name: "tom",
  age: 18
};

let proxy = new Proxy(person);

現(xiàn)在我們來看看調(diào)用get方法


可以看到編輯器也推斷出了參數(shù)key的類型,再來看看set方法


get方法一樣,編輯器也推斷出了參數(shù)key的類型,同時(shí)也推斷出了參數(shù)value的類型為string

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105657.html

相關(guān)文章

  • 十分鐘教你理解TypeScript中的泛型

    摘要:進(jìn)入其下載的目錄,并按照提示進(jìn)行安裝。理解中心思想剛才使用類型導(dǎo)致的問題,可以用中的泛型來解決。你可以在泛型聲明中繼承它這告訴,可使用任何具有屬性的類型。在中使用泛型的主要原因是使類型,類或接口充當(dāng)參數(shù)。 轉(zhuǎn)載請注明出處:葡萄城官網(wǎng),葡萄城為開發(fā)者提供專業(yè)的開發(fā)工具、解決方案和服務(wù),賦能開發(fā)者。 showImg(https://segmentfault.com/img/bVbuXpw?...

    hosition 評論0 收藏0
  • 一篇文章學(xué)會 TypeScript

    摘要:接下來來看一段代碼示例語法與語言比較當(dāng)類型不對的時(shí)候,會提示錯(cuò)誤編譯后語法聯(lián)想大致可以把它看成是加了類型系統(tǒng)的。 一篇文章學(xué)會 TypeScript (內(nèi)部分享標(biāo)題:TypeScript 基礎(chǔ)) 這篇文章是我在公司前端小組內(nèi)部的演講分享稿,目的是教會大家使用 TypeScript,這篇文章雖然標(biāo)著基礎(chǔ),但我指的基礎(chǔ)是學(xué)完后就能夠勝任 TypeScript 的開發(fā)工作。從我分享完的效果來...

    itvincent 評論0 收藏0
  • 為vue3學(xué)點(diǎn)typescript, 泛型

    摘要:往期第一課體驗(yàn)第二課基礎(chǔ)類型和入門高級類型第三課泛型第四課解讀高級類型插一課本來打算接著上節(jié)課把高級類型都講完但是寫著寫著我發(fā)現(xiàn)高級類型中有很多地方都需要泛型的知識那么先插一節(jié)泛型什么是類型變量和泛型變量的概念我們都知道可以表示任意數(shù)據(jù)類型 往期 第一課, 體驗(yàn)typescript 第二課, 基礎(chǔ)類型和入門高級類型 第三課, 泛型 第四課, 解讀高級類型 插一課 本來打算接著上節(jié)課, ...

    tianlai 評論0 收藏0
  • typescript - 一種思維方式

    摘要:怎么影響了我的思考方式對前端開發(fā)者來說,能強(qiáng)化了面向接口編程這一理念。使用的過程就是在加深理解的過程,確實(shí)面向接口編程天然和靜態(tài)類型更為親密。 電影《降臨》中有一個(gè)觀點(diǎn),語言會影響人的思維方式,對于前端工程師來說,使用 typescript 開發(fā)無疑就是在嘗試換一種思維方式做事情。 其實(shí)直到最近,我才開始系統(tǒng)的學(xué)習(xí) typescript ,前后大概花了一個(gè)月左右的時(shí)間。在這之前,我也在...

    CKJOKER 評論0 收藏0
  • TypeScript - 一種思維方式

    摘要:怎么影響了我的思考方式對前端開發(fā)者來說,能強(qiáng)化了面向接口編程這一理念。使用的過程就是在加深理解的過程,確實(shí)面向接口編程天然和靜態(tài)類型更為親密。摘要: 學(xué)會TS思考方式。 原文:TypeScript - 一種思維方式 作者:zhangwang Fundebug經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有。 電影《降臨》中有一個(gè)觀點(diǎn),語言會影響人的思維方式,對于前端工程師來說,使用 typescript 開...

    noONE 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<