TypeScript高级用法的知识点汇总(5)

在上述示例中我们通过使用keyof来限制函数的参数名property必须被包含在类型Rectangle的所有字符串索引中,如果没有被包含则编译器会报错,可以用来在编译时检测对象的属性名是否书写有误。

6、Partial 可选属性

在某些情况下,我们希望类型中的所有属性都不是必需的,只有在某些条件下才存在,我们就可以使用Partial来将已声明的类型中的所有属性标识为可选的,示例如下:

// 该类型已内置在TypeScript中 type Partial<T> = { [P in keyof T]?: T[P] }; interface Rectangle { x: number; y: number; width: number; height: number; } type PartialRectangle = Partial<Rectangle>; // 等价于 type PartialRectangle = { x?: number; y?: number; width?: number; height?: number; } let rect: PartialRectangle = { width: 100, height: 200 };

在上述示例中由于我们使用Partial将所有属性标识为可选的,因此最终rect对象中虽然只包含width和height属性,但是编译器依旧没有报错,当我们不能明确地确定对象中包含哪些属性时,我们就可以通过Partial来声明。

7、Pick 部分选择

在某些应用场景下,我们可能需要从一个已声明的类型中抽取出一个子类型,在子类型中包含父类型中的部分或全部属性,这时我们可以使用Pick来实现,示例代码如下:

// 该类型已内置在TypeScript中 type Pick<T, K extends keyof T> = { [P in K]: T[P] }; interface User { id: number; name: string; age: number; gender: number; email: string; } type PickUser = Pick<User, "id" | "name" | "gender">; // 等价于 type PickUser = { id: number; name: string; gender: number; }; let user: PickUser = { id: 1, name: 'tom', gender: 1 };

在上述示例中,由于我们只关心user对象中的id,name和gender是否存在,其他属性不做明确规定,因此我们就可以使用Pick从User接口中拣选出我们关心的属性而忽略其他属性的编译检查。

8、never 永不存在

never表示的是那些永不存在的值的类型,比如在函数中抛出异常或者无限循环,never类型可以是任何类型的子类型,也可以赋值给任何类型,但是相反却没有一个类型可以作为never类型的子类型,示例如下:

// 函数抛出异常 function throwError(message: string): never { throw new Error(message); } // 函数自动推断出返回值为never类型 function reportError(message: string) { return throwError(message); } // 无限循环 function loop(): never { while(true) { console.log(1); } } // never类型可以是任何类型的子类型 let n: never; let a: string = n; let b: number = n; let c: boolean = n; let d: null = n; let e: undefined = n; let f: any = n; // 任何类型都不能赋值给never类型 let a: string = '123'; let b: number = 0; let c: boolean = true; let d: null = null; let e: undefined = undefined; let f: any = []; let n: never = a; // -> Type 'string' is not assignable to type 'never'. let n: never = b; // -> Type 'number' is not assignable to type 'never'. let n: never = c; // -> Type 'true' is not assignable to type 'never'. let n: never = d; // -> Type 'null' is not assignable to type 'never'. let n: never = e; // -> Type 'undefined' is not assignable to type 'never'. let n: never = f; // -> Type 'any' is not assignable to type 'never'.

9、Exclude 属性排除

与Pick相反,Pick用于拣选出我们需要关心的属性,而Exclude用于排除掉我们不需要关心的属性,示例如下:

// 该类型已内置在TypeScript中 // 这里使用了条件类型(Conditional Type),和JS中的三目运算符效果一致 type Exclude<T, U> = T extends U ? never : T; interface User { id: number; name: string; age: number; gender: number; email: string; } type keys = keyof User; // -> "id" | "name" | "age" | "gender" | "email" type ExcludeUser = Exclude<keys, "age" | "email">; // 等价于 type ExcludeUser = "id" | "name" | "gender";

在上述示例中我们通过在ExcludeUser中传入我们不需要关心的age和email属性,Exclude会帮助我们将不需要的属性进行剔除,留下的属性id,name和gender即为我们需要关心的属性。一般来说,Exclude很少单独使用,可以与其他类型配合实现更复杂更有用的功能。

10、Omit 属性忽略

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/a5cd6f57eef1c0c30548e3ad454fcdf6.html