成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一看就懂的TypeScript工具類型

開發 前端
Partial,將T類型中的所有屬性變為可選屬性; Required,將T類型中的所有屬性變為必選屬性; Readonly,將T類型中的所有屬性變為只讀屬性。

TypeScript是一種靜態類型檢查的編程語言,它內置了許多基本數據類型,如字符串、數字和布爾型等。除了基本數據類型,當某種類型對于大多數代碼來說都非常有用時,它們就會被添加到TypeScript中并且被大家使用而無需擔心它們的可用性。這些內置在TS中的類型我們稱之為工具類型,這些工具類型位于TS安裝目錄typescript/lib/lib.es5.d.ts,熟悉這些工具類型,可以幫助我們提高開發效率。

Partial<T>、Required<T> 與 Readonly<T>

該組工具類型為改操作的工具類型,具體為將類型T的所有屬性都改為可選、必選或只讀。

定義:

/**
 * Make all properties in T optional
 */
type Partial<T> = {
    [P in keyof T]?: T[P];
};
/**
 * Make all properties in T required
 */
type Required<T> = {
    [P in keyof T]-?: T[P];
};
/**
 * Make all properties in T readonly
 */
type Readonly<T> = {
    readonly [P in keyof T]: T[P];
};

知識點:

in:關鍵字,用來實現遍歷;

keyof:關鍵字,索引類型查詢,用來獲取類型的所有鍵,返回的類型是聯合類型;

?:修飾符,表示可選屬性;

readonly:修飾符,表示只讀屬性;

-:修飾符,添加在“?”或"readonly"修飾符之前,表示移除“?”或"readonly"修飾符。

作用:

Partial,將T類型中的所有屬性變為可選屬性; Required,將T類型中的所有屬性變為必選屬性; Readonly,將T類型中的所有屬性變為只讀屬性。

應用:

interface Text {
  size: number
  color: string
}
type T = Partial<Text>
type R = Required<Text>
type O = Readonly<Text>

新定義的T類型中的屬性均為Text類型屬性,且均為可選;新定義的R類型中的屬性均為Text類型屬性,且均為必選;新定義的O類型中的屬性均為Text類型屬性,且均為只讀。

Record<K,T>

該類型可視作增操作相關的工具類型,根據我們指定的鍵值類型,新增一個對象類型。

定義:

/**
 * Construct a type with a set of properties K of type T
 */
type Record<K extends keyof any, T> = {
    [P in K]: T;
};

知識點:

keyof any:上面介紹過keyof(關鍵字,用來獲取類型的所有鍵,返回的類型是聯合類型),當對any使用keyof索引類型查詢時,結果類型為固定的聯合類型“string | number | symbol”;

K extends keyof any:泛型約束,定義了類型K的最大范圍為聯合類型“string | number | symbol”。

作用:

根據給定的屬性名類型和屬性類型創建一個新的對象類型。

應用:

type K = 'size'|'color'
type T = number
type R = Record<K, T>

新定義的R類型,包括屬性size和color,且類型均為number。

Exclude<T,U> 與 Extract<T,U>

該組類型可以視作查操作相關的工具類型,查出T類型中與U類型無關的屬性或相關的屬性。

定義:

/**
 * Exclude from T those types that are assignable to U
 */
type Exclude<T, U> = T extends U ? never : T;

/**
 * Extract from T those types that are assignable to U
 */
type Extract<T, U> = T extends U ? T : never;

知識點:

T extends U ? X : Y:條件類型,extends是關鍵字,若類型T能夠賦值給類型U,則條件類型的結果為類型X,否則為類型Y。

作用:

根據條件類型的定義,Exclude類型中若T類型中的屬性存在于U類型,則返回never,也就是從類型T中剔除所有類型U的屬性。Extract則恰恰和Exclude相反,返回類型T和類型U的交集。

應用:

interface Text {
  size: number
  color: string
}
interface Img {
  width: number
  color: string
}
type T = Exclude<Text,Img>
type R = Extract<Text,Img>

新定義的T類型,只有size屬性;新定義的R類型,只包含color屬性。

Pick<T,K>、Omit<T,K>與NonNullable

該組工具類型為刪操作相關的工具類型,包括剔除與指定鍵相關、無關或null、undefined類型操作的工具類型。

定義:

/**
 * From T, pick a set of properties whose keys are in the union K
 */
type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};
/**
 * Construct a type with the properties of T except for those in type K.
 */
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
/**
 * Exclude null and undefined from T
 */
type NonNullable<T> = T extends null | undefined ? never : T;

作用:

Pick類型從已有對象類型T中選取選定的屬性及其類型K創建新的類型。Omit與Pick類型相反,從已有對象類型T中剔除選定的屬性及其類型K創建新的類型。NonNullable與Omit相似,返回的結果為從T類型中剔除null and undefined類型。

應用:

interface Text {
  size: number
  color: string
}
type T = Pick<Text,'size'>
type R = Omit<Text,'size'>
type N = NonNullable<Text|null|undefinde>

新定義的T類型,只包括Text類型中的屬性size及其類型;新定義的T類型,只包括Text類型中的屬性color及其類型;新定義的N類型,只包括Text類型。

Parameters、ConstructorParameters、ReturnType與InstanceType

該組工具類型為與函數相關的工具類型,包括獲取普通函數參數和返回值的工具類型和獲取構造函數參數和返回值的構造類型。

定義:

/**
 * Obtain the parameters of a function type in a tuple
 */
type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;

/**
 * Obtain the parameters of a constructor function type in a tuple
 */
type ConstructorParameters<T extends new (...args: any) => any> = T extends new (...args: infer P) => any ? P : never;

/**
 * Obtain the return type of a function type
 */
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

/**
 * Obtain the return type of a constructor function type
 */
type InstanceType<T extends new (...args: any) => any> = T extends new (...args: any) => infer R ? R : any;

知識點:

infer:關鍵字,在extends條件類型語句(T extends U ?X : Y)中,允許在類型U的位置上使用關鍵字infer定義可推斷的類型變量,可推斷的類型變量只允許在類型X的位置上使用。簡單應用如下,取出數組中的類型:

type ExtractArrayItemType<T> = T extends (infer U)[] ? U : T;
// 條件判斷為 true,返回 U
type T = ExtractArrayItemType<string[]>; // string

作用:

Parameters工具類型能夠獲取函數類型的參數類型,并使用參數類型構造一個元組類型; ConstructorParameters工具類型可以把構造函數的參數類型作為一個元組類型返回;ReturnType工具類型可以獲取函數的返回值類型; InstanceType工具類型可以獲取構造函數的返回類型;

應用:

type Fn = (a: string, b: number) => string;
type FnParamTypes = Parameters(Fn);  // [string, number]
type FnReturnType = ReturnType(Fn); // string

interface FunctionConstructor {
  new(...args: string[]): Function;
  (...args: string[]): Function;
  readonly prototype: Function;
}

type ConstructorParamTypes = ConstructorParameters(FunctionConstructor) // string[]

type ConstructorInstanceType = InstanceType(FunctionConstructor) // Function

ThisParameterType、OmitThisParameter與ThisType

該組類型均為與this相關的工具類型。

定義:

/**
 * Extracts the type of the 'this' parameter of a function type, or 'unknown' if the function type has no 'this' parameter.
 */
type ThisParameterType<T> = T extends (this: infer U, ...args: any[]) => any ? U : unknown;

/**
 * Removes the 'this' parameter from a function type.
 */
type OmitThisParameter<T> = unknown extends ThisParameterType<T> ? T : T extends (...args: infer A) => infer R ? (...args: A) => R : T;
/**
 * Marker for contextual 'this' type
 */
interface ThisType<T> { }

知識點:

unknown:頂端類型,TypeScript中僅有any和unknown兩種頂端類型,所有其他類型都可以賦值給兩者,但unknown只能賦值給any類型和unknown類型。TypeScript中只有一個尾端類型never,是其他所有類型的子類型。

作用 ThisParameterType類型可以獲取函數參數中this參數的類型;OmitThisParameter類型可以剔除函數參數中this參數的類型;ThisType類型可以對象字面量中this的類型。

應用

interface Foo {
    x: number
};

function fn(this: Foo) {}

type Test = ThisParameterType<typeof fn>; // Foo

type Fn = (this: Foo) => void

type NonReturnFn = OmitThisParameter<Fn>; // () => void

let obj: ThisType<{x: number, getX: () => number}>

obj = {
  x: 100,
  getX(){
    return this.x
  }
}

以上簡單介紹了TypeScript中的自帶工具類型,TypeScript與JavaScript有相通之處,但又有更多的不同和背景知識,只有內化了這些知識同時不斷地練習才能有效掌握這一門語言。


圖片

責任編輯:武曉燕 來源: 大轉轉FE
相關推薦

2020-09-21 08:33:12

線程池調度Thread Pool

2018-09-28 14:28:28

MySQL存儲過程

2021-07-15 09:55:47

systemdLinux文件

2020-04-15 08:33:43

Netty網絡通信

2020-03-27 09:06:54

選擇排序算法冒泡排序

2021-05-14 07:11:49

方法調用類加載

2022-05-29 22:55:00

適配器設計模式

2021-12-30 09:10:28

游戲開發開發技術熱點

2022-08-15 19:49:57

Consul架構注冊中心

2019-08-14 10:20:32

算法數組鏈表

2019-01-15 09:55:24

RAID磁盤陣列數據存儲

2020-05-09 14:40:29

UI設計開發

2015-07-21 13:07:14

Reactjs教程

2025-03-04 02:00:00

Python編寫自動化

2024-12-12 08:22:03

負載均衡算法無狀態

2022-03-21 21:05:40

TypeScript語言API

2022-06-19 22:54:08

TypeScript泛型工具

2024-11-20 16:02:47

.NET 9LINQ開發

2021-05-13 07:30:27

Kafka消息流系統

2021-01-07 10:30:23

設計模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色又黄又爽网站www久久 | wwwxxx国产 | 国产精品日韩一区 | 午夜精品一区二区三区在线观看 | 精品久久久久久久久久久 | 91污在线 | 亚洲福利一区 | 成人亚洲视频 | 亚洲永久精品国产 | 一级在线观看 | 91国产视频在线观看 | 午夜精品一区二区三区在线观看 | 国产精品99久久免费观看 | 一区二区三区国产 | 中文字幕一区二区三区在线观看 | 一区二区视频在线观看 | 天天插天天操 | 亚洲图片一区二区三区 | 久久精品在线播放 | 天天躁人人躁人人躁狂躁 | caoporn国产精品免费公开 | 久久成人免费视频 | 欧美成人a | 久久亚洲一区二区三区四区 | 亚洲国产成人精品一区二区 | 日韩欧美亚洲 | 国产精品久久久久久久午夜 | 亚洲精品在线观 | 成人av网页| 国产精品3区 | 久久久久亚洲精品 | 久久最新 | 91国产精品在线 | 国产一区二区中文字幕 | 国产乱码精品一区二区三区忘忧草 | 2019中文字幕视频 | 亚洲成人黄色 | 日日噜噜噜夜夜爽爽狠狠视频, | a级片在线观看 | 99精品视频免费观看 | 国产在线一区二区三区 |