一些类型的简写的语法糖

Partial

部分的,就是将必要的属性转变为可选属性

  1. type Partial<T> = {
  2. [P in keyof T]?: T[P];
  3. };
  1. interface User {
  2. name: string;
  3. email: string;
  4. age: number;
  5. }
  6. let user: Partial<User> = {
  7. name: "jack",
  8. age: 18
  9. };
  10. //不报错

Required

用来将可选属性变为必须属性

  1. type Required<T> = {
  2. [P in keyof T]-?: T[P];
  3. };
  1. interface User {
  2. name: string;
  3. age?: number;
  4. }
  5. let user: Required<User> = {
  6. name: "jack"
  7. };
  8. //报错
  9. let user: Required<User> = {
  10. name: "jack",
  11. age: 18
  12. };
  13. 不报错

Pick

用来指定某个类型的子类型,可以结合字面量类型和联合类型
从源码可以看出,第二个参数必须包含在第一个参数的键中

  1. type Pick<T, K extends keyof T> = {
  2. [P in K]: T[P];
  3. };
  1. interface Parent {
  2. name: string;
  3. age: number;
  4. }
  5. type picked = "name" | "age";
  6. let child: Pick<Parent, picked> = {
  7. name: "jack"
  8. };
  9. //报错
  10. let child: Pick<Parent, picked> = {
  11. name: "jack",
  12. age: 18
  13. };
  14. //不报错

Record

用来给对象每一个键统一设置相同的类型
第一个参数是任何键名,第二个参数是要设置的类型,结合字面量类型和联合类型使用

  1. type Record<K extends keyof any, T> = {
  2. [P in K]: T;
  3. };
  1. interface People {
  2. name: string;
  3. age: number;
  4. }
  5. type FriendsNames = "jack" | "parker";
  6. let friends: Record<FriendsNames, People> = {
  7. jack: {
  8. name: "jack",
  9. age: 18
  10. },
  11. parker: {
  12. name: "parker",
  13. age: 20
  14. }
  15. };

Exclude

用来排除某一个对象中其他对象的键,相当于做差集

  1. type Exclude<T, U> = T extends U ? never : T;
  1. type c_d = Exclude<"a" | "b" | "c" | "d", "c" | "d" | "e">; //'c'|'d'
  2. type c = Exclude<"a" | "b" | "c", "a" | "b">;//'c'
  3. let C: c = "c";

Extract

提取,相当于做一个交集

  1. type Extract<T, U> = T extends U ? T : never;
  1. type a_c = Extract<'a' | 'b' | 'c', 'a' | 'b' | 'd'>; //'a'|'c'

ReturnType

用来获取函数的返回类型

  1. type ReturnType<T extends (...args: any[]) => any> =
  2. T extends (...args: any[]) => infer R ? R : any;

使用

  1. function foo(x: number): Array<number> {
  2. return [x];
  3. }
  4. type fn = ReturnType<typeof foo>; // -> number[]

ThisType

这个内置类型不是二次封装后的结果,而是底层实现后的结果
用来指定对象中的this的指向
一般用交叉类型来补充this的指向

  1. interface Person {
  2. name: string;
  3. age: number;
  4. dosth: Function;
  5. }
  6. const obj: Person & ThisType<Person> = {
  7. name: "a",
  8. age: 18,
  9. dosth() {
  10. console.log(this.sss);
  11. }
  12. };

InstanceType

用来获取构造函数类型的实例的类型

  1. type InstanceType<T extends new (...args: any[]) => any> = T extends new (...args: any[]) => infer R
  2. ? R
  3. : any;
  1. class C {
  2. x = 0;
  3. y = 0;
  4. }
  5. type T20 = InstanceType<typeof C>; // C
  6. type T21 = InstanceType<any>; // any
  7. type T22 = InstanceType<never>; // any
  8. type T23 = InstanceType<string>; // Error
  9. type T24 = InstanceType<Function>; // Error

Parameters

用来获取函数参数组成的元组类型,顺序是不能错的

  1. type Parameters<T extends (...args: any[]) => any> =
  2. T extends (...args: infer P) => any ? P : never;
  1. function foo(x: number, y: string): (string | number)[] {
  2. return [y, x, x];
  3. }
  4. type P = Parameters<typeof foo>;//[number,string]
  5. let a: P = ["a", 1];//报错

NonNullChecks

用来排除类型中的null和undefined

  1. type NonNullable<T> = T extends null | undefined ? never : T;

使用这个类型需要开启一个选项

  1. {
  2. "compilerOptions": {
  3. "strictNullChecks": true
  4. }
  5. }
  1. type T = string | number | null;
  2. type U = NonNullable<T>; // -> string | number;
  3. let a: U = "1";
  4. let b: U = 1;
  5. let c: U = undefined;//报错
  6. let d: U = null;//报错

ConstructorParameters

用来获得类的constructor的参数获得类型组成的元组

  1. type ConstructorParameters<T extends new (...args: any[]) => any> =
  2. T extends new (...args: infer P) => any ? P : never;
  1. class Person {
  2. private firstName: string;
  3. private lastName: string;
  4. constructor(firstName: string) {
  5. this.firstName = firstName;
  6. }
  7. }
  8. type P = ConstructorParameters<typeof Person>; //[string]

Omit

省略,表示从一个接口类型中,省略其中的某一个属性或者方法

  1. type User = Omit<{ name: string; age: number }, "name">;
  2. let jack: User = {
  3. name: "jack",
  4. age: 18
  5. };
  6. //报错,因为省略了name
  7. let jack: User = {
  8. age: 18
  9. };
  10. //通过

ThisParameterType

用来获取一个类型中this的类型

  1. function toHex(this: Number) {
  2. return this.toString(16);
  3. }
  4. //尽管传入了this,但是这只是类型检查,因此运行的时候this还是window
  5. function numberToString(n: ThisParameterType<typeof toHex>) {
  6. return toHex.apply(n);//这里的n的类型是number,因为上面传给了this number类型
  7. }

OmitThisParameter

用来获取忽略this类型后的类型

  1. function toHex(this: Number) {
  2. return this.toString(16);
  3. }
  4. type fiveToHex = typeof toHex;//(this:number)=>string;
  5. type fiveToHex = OmitThisParameter<typeof toHex>;//()=>string;