国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

分享幾個TypeScript泛型的使用場景

騫諱護 / 2571人閱讀

摘要:最近使用寫了一個項目過程中不斷感受到的魅力現在來分享幾個業務中關于泛型的場景深度內置了一個類型用于把一個類型的成員屬性設置為成可選模式例如類型中有兩個成員屬性如果我們要把這個類型賦予變量那必須擁有和兩個屬性現在我們要讓的兩個屬性都變為可選可

最近使用TypeScript寫了一個項目,過程中不斷感受到TypeScript的魅力,現在來分享幾個業務中關于泛型的場景

1. 深度Partial

TS內置了一個Partial類型,用于把一個類型的成員屬性設置為成可選模式,例如

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

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

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

現在我們要讓Person的兩個屬性都變為可選,可以使用Partial類型進行轉換

type PartialPerson = Partial;

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

這時PartialPersonnameage屬性都已經變為可選的了,但是如果我們在Person中再加一點東西

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

現在我們加入了一個contact屬性值是一個對象,如果我們想把contact里面的屬性也變為可選Partial就不靈了

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

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

很容易理解關鍵點是在?:上,現在我們改造一下

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然后進行再次DeepPartial或者返回T[P]的類型


這時編譯器就不會再提示錯誤了

2. 更智能的array_column函數

在PHP中有一個array_column函數,用于在數組中提取一列的內容,用JavaScript表現就是

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

假如現在有一個persons數組

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

let persons: Person[] = [];

我們需要提取數組中的name屬性,可以很方便的使用Array.map方法提取,但是如果又有別的數組需要提取,我們可以實現一個更優雅的array_column函數

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

現在我們使用這個函數提取persons數組


可以看到當我們輸入persons時,編輯器已經推斷出了key的類型,再來一個animals數組

3. Proxy

在剛開始學習TS的時候看官方文檔有一個Proxy的例子,只給出了類型聲明但卻沒有給出實現,當時花了不少時間琢磨,現在來實現它

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,現在我們基于上面的Person類型創建一個Proxy實例

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

let proxy = new Proxy(person);

現在我們來看看調用get方法


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


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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/105657.html

相關文章

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

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

    hosition 評論0 收藏0
  • 一篇文章學會 TypeScript

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

    itvincent 評論0 收藏0
  • 為vue3學點typescript, 泛型

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

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

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

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

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

    noONE 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<