开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
分布式条件类型
- 当条件类型作用于一个通用类型时,当给定一个联合类型时,他们就变成了分布式的
- 通常情况下,分布性是需要行为的,为了避免这种行为,你可以用括包包围extends关键字的每一边
基础用法
type MyType<T> = T extends any ? T : never;
type res = MyType<string | number | boolean>
从T中剔除可以赋值给U的类型 Exclude
// nerver
type res = Exclude<string | number | boolean, boolean | number | string>
// string
type res = Exclude<string | number | boolean, boolean | number >
从T中剔除null和undefind NonNullable
// string | number | boolean
type res = NonNullable<string | number | boolean | null | undefined>
获取返回值类型 ReturnType
// bigint
type res = ReturnType<()=>bigint>
获取一个类的构造函参数组成的元组类型 ConstructorParameters
class Person {
constructor(name: string, age: number) {
}
}
type res=ConstructorParameters<typeof Person>
获取函数参数类型组成的元组类型 Parameters
function start(name: string, age: number) {
}
type res = Parameters<typeof start>
const r: res = ['s', 12]
infer 关键字推断
- 条件类型为我们提供了一种方法来推断我们在真实分支中使用infer关键字进行类型推断
- 我们可以使用infer关键字编写一些有用的辅助类型别名
假如想要获取数组里的元素类型,如果是数组则返回数组中元素的类型 否则返回这个类型本身
type ID = number[];
type IName = string[];
type Unpacked<T> = T extends IName ? string : T extends ID ? number : T;
type res=Unpacked<any>
利用infer关键字可以简化操作 当T继承Array[K]时,返回K,否则返回T本身,是什么数组就返回什么类型,不是数组就是返回类型本身
type ElementOf<T> = T extends Array<infer K> ? K : T;
type res = ElementOf<IName>
infer 关键字可以推断出联合类型
当T 继承自 后面这个类型时,返回这个类型的ab属性的类型集合,否则返回nerver
type Foo<T> = T extends { a: infer U, b: infer U } ? U : never;
// number | string
type res=Foo<{a:number,b:string}>
// nerver
type res2 = Foo<{ a: number, c: string }>;