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) => {}>
2.ReturnType用于提取函数类型的返回值类型
type ReturnType<T extends (...args: any) => any> =
T extends (...args: any) => infer R ? R : any
type ReturnTypeRes = ReturnType<() => 'dong'>
3.ConstructorParameters:用于提取构造器参数的类型,构造器类型和函数类型的区别就是可以被new
InstanceType: 用于提取构造器返回值的类型
4.Partial:把索引变为可选
type Partial<T> = {
[P in keyof T]?: T[P]
}
type PartialRes = Partial<{name: 'dong', age: 18}>
5.Required: 去掉可选
type Required<T> = {
[P in keyof T]-?: T[P]
}
type RequiredRes = Required<{name?: 'dong', age?: 18}>
6.readonly
type Readonly<T> = {
readonly [P in keyof T]: T[P]
}
type ReadonlyRes = Readonly<{name: 'dong', 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'>
8.Record:用于创建索引类型,传入key和值的类型
type Record<K extends keyof any, T> = {
[P in K]: T
}
type RecordRes = Record<'a'|'b', number>
9.Exclude:当想从一个联合类型中去掉一部分类型,可以用Exclude类型
type Exclude<T, U> = T extends U ? never : T;
type ExcludeRes = Exclude<'a'|'b'|'c'|'d', 'a'|'b'>
10.Extract:当想从一个联合类型中保留一部分类型,可以用Extract
type Extract<T, U> = T extends U ? T : never;
type ExtractRes = Extract<'a'|'b'|'c'|'d', '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'>
12.NonNullable: 用于判断是否为非空类型,也就是不是null或者undefined的类型
type NonNullable<T> = T extends null | undefined ? never : T
type NonNullableRes = NonNullable<{name: 'guang'}>
13.Uppercase、Lowercase、Capitalize、Uncapitalize
这四个类型是分别实现大写、小写、首字母大写、去掉首字母大写
type UpperCaseRes = Uppercase<'aaa'>
type LowercaseRes = Lowercase<'AAA'>
type CapitalizeRes = Capitalize<'aaa'>
type UncapitalizeRes = Uncapitalize<'Aaa'>