TS内置类型

25 阅读3分钟

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>>>