日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
一篇學會TypeScript實用工具類型

1. Partial

Partial 作用是將傳入的屬性變?yōu)榭蛇x項。適用于對類型結構不明確的情況。它使用了兩個關鍵字:keyof和in,先來看看它們都是什么含義。keyof 可以用來取得接口的所有 key 值:

為夷陵等地區(qū)用戶提供了全套網頁設計制作服務,及夷陵網站建設行業(yè)解決方案。主營業(yè)務為網站設計制作、成都做網站、夷陵網站設計,以傳統(tǒng)方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

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

type T = keyof Person
// T 類型為: "name" | "age" | "number"

in關鍵字可以遍歷枚舉類型,:

type Person = "name" | "age" | "number"

type Obj = {
[p in Person]: any
}
// Obj 的類型為: { name: any, age: any, number: any }

keyof 可以產生聯(lián)合類型, in 可以遍歷枚舉類型。所以可以一起使用, 下面是Partial的定義:

/**
* Make all properties in T optional
* 將T中的所有屬性設置為可選
*/
type Partial = {
[P in keyof T]?: T[P];
};

這里,keyof T 用來獲取 T 所有屬性名, 然后使用 in 進行遍歷, 將值賦給 P, 最后 T[P] 取得相應屬性的值。中間的?就用來將屬性設置為可選。

來看下面的例子:

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

type PartialPerson = Partial;
// PartialPerson 的類型為 {name?: string; age?: number; height?: number;}

const person: PartialPerson = {
name: "zhangsan";
}

這里就使用Partial將Person類型中的屬性都指定為可選屬性。

2. Required

Required 的作用是將傳入的屬性變?yōu)楸剡x項,和上面的Partial恰好相反,其聲明如下:

/**
* Make all properties in T required
* 將T中的所有屬性設置為必選
*/
type Required = {
[P in keyof T]-?: T[P];
};

可以看到,這里使用-?將屬性設置為必選,可以理解為減去問號。使用形式和上面的Partial差不多:

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

type RequiredPerson = Required;
// RequiredPerson 的類型為 {name: string; age: number; height: number;}

const person: RequiredPerson = {
name: "zhangsan";
age: 18;
height: 180;
}

這里就使用Required將Person類型中的屬性都指定為必選屬性。

3. Readonly

將T類型的所有屬性設置為只讀(readonly),構造出來類型的屬性不能被再次賦值。Readonly的聲明形式如下:

/**
* Make all properties in T readonly
*/
type Readonly = {
readonly [P in keyof T]: T[P];
};

來看下面的例子:

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

type ReadonlyPerson = Readonly;

const person: ReadonlyPerson = {
name: "zhangsan",
age: 18
}

person.age = 20; // Error: cannot reassign a readonly property

可以看到,通過 Readonly 將Person的屬性轉化成了只讀,不能再進行賦值操作。Readonly 類型對于凍結對象非常有用。

4. Pick

從 Type類型中挑選部分屬性 Keys 來構造新的類型。它的聲明形式如下:

/**
* From T, pick a set of properties whose keys are in the union K
*/
type Pick = {
[P in K]: T[P];
};

來看下面的例子:

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

const person: Pick = {
name: "zhangsan",
age: 18
}

這樣就使用Pick從Person類型中挑出來了name和age屬性的類型,新的類型中只包含這兩個屬性。

5. Record

Record 用來構造一個類型,其屬性名的類型為Keys中的類型,屬性值的類型為Type。這個工具類型可用來將某個類型的屬性映射到另一個類型上,下面是其聲明形式:

/**
* Construct a type with a set of properties K of type T
*/
type Record = {
[P in K]: T;
};

來看下面的例子:

type Pageinfo = {
title: string;
}

type Page = 'home' | 'about' | 'contact';

const page: Record = {
about: {title: 'about'},
contact: {title: 'contact'},
home: {title: 'home'},
}

6. Exclude

Exclude 用于從類型Type中去除不在ExcludedUnion類型中的成員,下面是其聲明的形式:

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

來看下面的例子:

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

const person: Exclude = {
name: "zhangsan";
height: 180;
}

這里就使用Exclude將Person類型中的age屬性給剔除了,只會剔除兩個參數(shù)中都包含的屬性。

7. Extract

Extract 用于從類型Type中取出可分配給Union類型的成員。作用與Exclude相反。下面是它的聲明形式:

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

來看下面的例子:

type ExtractedType = Extract<"x" | "y" | "z", "x" | "y">;
// "x" | "y"

該工具類型對于找出兩種類型的公共部分很有用:

interface Human {
id: string;
name: string;
surname: string;
}

interface Cat {
id: string;
name: string;
sound: string;
}

// "id" | "name"
type CommonKeys = Extract;

8. Omit

上面的 Pick 和 Exclude 都是最基礎的工具類型,很多時候用 Pick 或者 Exclude 可能不如直接寫類型更直接。而 Omit 就基于這兩個來做的一個更抽象的封裝,它允許從一個對象中剔除若干個屬性,剩下的就是需要的新類型。下面是它的聲明形式:

/**
* Construct a type with the properties of T except for those in type K.
*/
type Omit = Pick>;

來看下面的例子:

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

const person: Omit = {
name: "zhangsan";
}

這樣就使用Omit從Person類型中剔除了 age 和 height 屬性,只剩下 name 屬性。

9. ReturnType

ReturnType會返回函數(shù)返回值的類型,其聲明形式如下:

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

來看下面的例子:

function foo(type): boolean {
return type === 0
}

type FooType = ReturnType

這里使用 typeof 是為了獲取 foo 的函數(shù)簽名,等價于 (type: any) => boolean。

10. InstanceType

InstanceType 會返回 Type 構造函數(shù)類型的實例類型。其聲明形式如下:

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

來看下面的例子:

class Person {
name: string;
age: number;

constructor(person: { name: string; age: number }) {
this.name = person.name;
this.age = person.age;
}
}

type PersonInstanceType = InstanceType;
// PersonInstanceType 的類型:{ name: string; age: number }

當然,你可能不會這么寫,因為可以直接使用UserManager類型:

class Person {
name: string;
age: number;

constructor(person: { name: string; age: number }) {
this.name = person.name;
this.age = person.age;
}
}

const person: Person = {
name: "zhangsan",
age: 18,
};

這就等價于:

class Person {
name: string;
age: number;

constructor(person: { name: string; age: number }) {
this.name = person.name;
this.age = person.age;
}
}

type PersonInstanceType = InstanceType;

const person: PersonInstanceType = {
name: "zhangsan",
age: 18,
};

當我們在 TypeScript 中創(chuàng)建動態(tài)類時,InstanceType可以用于檢索動態(tài)實例的類型。

11. Parameters

Parameters 可以從函數(shù)類型Type的參數(shù)中使用的類型構造一個元組類型。其聲明形式如下:

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

來看下面的例子:

const add = (x: number, y: number) => {
return x + y;
};

type FunctionParameters = Parameters;
// FunctionParameters 的類型:[x: number, y: number]

除此之外,還可以檢測單個參數(shù):

// "number"
type FirstParam = Parameters[0];

// "number"
type SecondParam = Parameters[1];

// "undefined"
type ThirdParam = Parameters[2];

Parameters 對于獲取函數(shù)參數(shù)的類型以確保類型安全很有用,尤其是在使用第三方庫時:

const saveUser = (user: { name: string; height: number; age: number }) => {
// ...
};

const user: Parameters[0] = {
name: "zhangsan",
height: 180,
age: 18,
};

12. ConstructorParameters

ConstructorParameters 可以從構造函數(shù)的類型來構造元組或數(shù)組類型。其聲明形式如下:

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

它類似于參數(shù),但適用于類構造函數(shù):

class Person {
private name: string;
private age: number;

constructor(person: { name: string; age: number }) {
this.name = person.name;
this.age = person.age;
}
}

type ConstructorParametersType = ConstructorParameters;
// ConstructorParametersType 的類型:[person: { name: string, age: number}]

與 Parameters 類型一樣,當使用外部庫時,它有助于確保構造函數(shù)接受我們傳入的參數(shù):

class Person {
private name: string;
private age: number;

constructor(person: { name: string; age: number }) {
this.name = person.name;
this.age = person.age;
}
}

const params: ConstructorParameters[0] = {
name: "zhangsan",
age: 18,
};

13. NonNullable

NonNullable 通過從Type中排除null和undefined來創(chuàng)建新類型。它就等價于Exclude。其聲明形式如下:

/**
* Exclude null and undefined from T
*/
type NonNullable = T extends null | undefined ? never : T;

來看下面的例子:

type Type = string | null | undefined; 

// string
type NonNullableType = NonNullable;

這里就使用NonNullable將Type中的null和undefined剔除掉了。


新聞名稱:一篇學會TypeScript實用工具類型
瀏覽地址:http://m.5511xx.com/article/cohghgp.html