TypeScript/TS基础知识三

51 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 }>;