1、条件类型
条件类型 三目运算符
type TVal<T> = T extends number ? 'yes' : 'no'
type TResult = TVal<1>
从结构判断 子类型必符合父类型
类型范围划分:又大到小
- never 为任意类型的子类型
- 字面量
- 基础类型
- 构造函数
- any unknown
// 都为true
type TChild1 = never extends '' ? true : false
type TChild2 = '' extends string ? true : false
type TChild3 = string extends String ? true : false
type TChild4 = String extends unknown ? true : false
type TChild5 = unknown extends any ? true : false
type TChild6 = any extends unknown ? true : false
object和{},object判断一定需要是对象。
// false
type TObj1 = 1 extends object ? true : false
// 以下都为true
type TObj2 = 1 extends {} ? true : false
type TObj3 = 1 extends Object ? true : false
type TObj4 = object extends Object ? true : false
type TObj5 = Object extends object ? true : false
any自带分发机制,如果左边是any,则会收集所有结果。
// 1 | '1'
type IType = any extends 1 ? 1 : '1'
// 1
type IType2 = never extends 1 ? 1 : '1'
// never如果通过泛型传递,结果会是never
type IType3<T> = T extends 1 ? 1 : '1'
// never
type IType4 = IType3<never>
什么时候会触发分发机制?
- 使用联合类型通过泛型传递
- 使用
extends判断条件 - 判断类型需要裸类型,除了泛型本身没有其他
通过 T & {} 可以解决分发问题
// type TResult<T> = T & {} extends string ? true : false
type TResult<T> = T extends string ? true : false
// true
type TResult1 = TResult<'1'>
// false
type TResult2 = TResult<1>
// 触发分发机制,boolean
type TResult3 = TResult<1 | '1'>
// 如何判断两个类型完全一致
type NoDistribute<T> = T & {}
// type TEqual<T, U> = [T] extends [U] ? ([U] extends [T] ? true : false) : false
type TEqual<T, U> = NoDistribute<T> extends U ? (NoDistribute<U> extends T ? true : false) : false
type TResult = TEqual<1 | 2, 1 | 2>
2、Extract
提取对象,联合类型的部分属性。
// Extract 提取类型
// 'a'
type TA1 = Extract<'a' | 'b' | 'c', 'a' | 'e'>
3、Exclude
剔除对象,联合类型的部分属性,留剩余的部分。
// Exclude 剔除类型
// 'b' | 'c'
type TA2 = Exclude<'a' | 'b' | 'c', 'a' | 'e'>
4、NonNullable
排除`null`, `undefined`
// NonNullable 剔除 null 和 undefined
// string | number
type TA3 = NonNullable<string | number | null | undefined>
5、ReturnType
获取函数的返回值类型
// ReturnType 获取函数返回值类型
// string
type TA4 = ReturnType<() => string>
6、InstanceType
获取构造函数的实例类型
// InstanceType 获取构造函数的实例类型
// Person
class Person {
constructor() {}
}
type Instance = InstanceType<typeof Person>
7、Parameters
获取函数的参数类型
// Parameters 获取函数参数类型
// [x: string, y: number]
type TA7 = Parameters<(x: string, y: number) => void>
8、Required
将对象属性都转为必填属性
// Required 获取所有属性都是必填的
// {
// a: string;
// b: number;
// }
type TA8 = Required<{ a?: string; b?: number }>
9、Partial
将对象属性都转为选填属性
// Partial 获取所有属性都是可选的
// {
// a?: string;
// b?: number;
// }
type TA9 = Partial<{ a: string; b: number }>
10、Readonly
将对象属性都转为只读属性
// Readonly 获取所有属性都是只读的
// {
// readonly a: string;
// readonly b: number;
// }
type TA10 = Readonly<{ a: string; b: number }>
11、Record
创建一个对象类型
// Record<K, T> 创建一个对象类型,其属性键为 K,属性值为 T
// {
// a: number;
// b: number;
// }
type TA11 = Record<'a' | 'b', number>
12、Pick
获取对象的部分属性
// Pick 获取对象部分属性
// {
// a: number;
// }
type TA12 = Pick<{ a: string; b: number }, 'a'>
13、Omit
// Omit 获取对象除了部分属性
// {
// b: number;
// }
type TA13 = Omit<{ a: string; b: number }, 'a'>
14、infer
// infer 获取条件类型中的某一类型
type TA14<T extends (...args: any[]) => any> = T extends (...args: any[]) => infer R ? R : never
// string
type TA15 = TA14<() => string>
// 递归取类型,取Promise中返回值非Promise的类型
type TA16<T> = T extends Promise<infer R> ? TA16<R> : T
type TA17 = TA16<Promise<Promise<string>>>