Typescript内置的一些高级类型

64 阅读2分钟
Typescript内置了一些高级类型
1.Parameters 用于提取函数类型的参数类型
// 源码
type Parameters<T extends (...args:any) => any> = 
   T extends (...args:infer P) => any ? P : never;
   
type ParametersRes = 
  Parameters<(name: string, age: number) => {}> 
// [name: string, age: number]
2.ReturnType用于提取函数类型的返回值类型
// 源码
type ReturnType<T extends (...args: any) => any> = 
  T extends (...args: any) => infer R ? R : any

type ReturnTypeRes = ReturnType<() => 'dong'> // type ReturnTypeRes = "dong"
3.ConstructorParameters:用于提取构造器参数的类型,构造器类型和函数类型的区别就是可以被new
InstanceType: 用于提取构造器返回值的类型
4.Partial:把索引变为可选
// 源码:
type Partial<T> = {
  [P in keyof T]?: T[P]
}

type PartialRes = Partial<{name: 'dong', age: 18}>
// type PartialRes = {
//   name?: "dong" | undefined;
//   age?: 18 | undefined;
// }
5.Required: 去掉可选
// 源码
type Required<T> = {
  [P in keyof T]-?: T[P]
}

type RequiredRes = Required<{name?: 'dong', age?: 18}>
// type RequiredRes = {
//   name: 'dong';
//   age: 18;
// }
6.readonly
// 源码
type Readonly<T> = {
  readonly [P in keyof T]: T[P]
}

type ReadonlyRes = Readonly<{name: 'dong', age: 18}>
// type ReadonlyRes = {
//   readonly name: 'dong';
//   readonly age: 18;
// }
7.Pick:映射类型的语法用于构造新的索引类型,在构造的过程中可以对索引和值做一些修改和过滤
// 源码
type Pick<T, K extends keyof T> = {
  [P in K]: T[P]
}

type PickRes = Pick<{name: 'dong', age: 18, sex: 1}, 'name' | 'age'>
// type PickRes = {
//   name: 'dong';
//   age: 18;
// }

8.Record:用于创建索引类型,传入key和值的类型
// 源码
type Record<K extends keyof any, T> = {
  [P in K]: T
}

type RecordRes = Record<'a'|'b', number>
// type RecordRes = {
//   a: number;
//   b: number;
// }
9.Exclude:当想从一个联合类型中去掉一部分类型,可以用Exclude类型
// 源码
type Exclude<T, U> = T extends U ? never : T;

type ExcludeRes = Exclude<'a'|'b'|'c'|'d', 'a'|'b'> // "d" | "c"
10.Extract:当想从一个联合类型中保留一部分类型,可以用Extract
// 源码
type Extract<T, U> = T extends U ? T : never;

type ExtractRes = Extract<'a'|'b'|'c'|'d', 'a'|'b'> // "a" | "b"
11.Omit: 去掉这部分索引构造成的索引类型
// 源码
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>

type OmitRes = Omit<{name: 'guang', age: 20}, 'name'>
// type OmitRes = {
//   age: 20;
// }
12.NonNullable: 用于判断是否为非空类型,也就是不是null或者undefined的类型
// 源码
type NonNullable<T> = T extends null | undefined ? never : T

type NonNullableRes = NonNullable<{name: 'guang'}>
// type NonNullableRes = {
//   name: 'guang';
// }
13.Uppercase、Lowercase、Capitalize、Uncapitalize
这四个类型是分别实现大写、小写、首字母大写、去掉首字母大写
type UpperCaseRes = Uppercase<'aaa'>  // "AAA"

type LowercaseRes = Lowercase<'AAA'> // "aaa"

type CapitalizeRes = Capitalize<'aaa'> // "Aaa"

type UncapitalizeRes = Uncapitalize<'Aaa'> // "aaa"