10. 内置类型

105 阅读1分钟

通过条件类型, ts 实现了一些常见的内置类型

  • Extract(叉集抽离)语法 Extract<类型1,类型2>,返回值两个类型的交集
type Conditional = Extract<string | number | boolean, string | number> // string | number

// 实现:
type MyExtract<T, U> = T extends U ? T : never // 和 never 的联合类型是类型本身
type Conditional = MyExtract<string | number | boolean, string | number> // string | number
  • Exclude 排除类型
type condition = Exclude<1 | 2 | 3 | 4 | 5, 1 | 2> // 3 | 4 | 5
type MyExclude<T, U> = T extends U ? never : T
type condition = MyExclude<1 | 2 | 3 | 4 | 5, 1 | 2> // 3 | 4 | 5
  • NonNullable 取非空类型
type condition = NonNullable<1 | 2 | null | undefined> // 1 | 2
type NonNullable<T> = T extends null | undefined ? never : T
  • 获取函数类型和返回值类型
function getObj(name:string,age:number) {
    return {
        name,age
    }
}
type Ifn = typeof getObj
/**
 * (name: string, age: number) => {
    name: string;
    age: number;
    }
 */
type Ireturn = ReturnType<typeof getObj> // {name: string; age: number;}
  • 获取参数类型
function getObj(name: string, age: number) {
    return { name, age }
}

type R1 = Parameters<typeof getObj> // [name: string, age: number]
  • 两个接口合并
interface Person1 {
    handsome: boolean
}
interface Person2 {
    high: string
}
type Computed<T extends object> = { [K in keyof T]: T[K] }
type Person3 = Computed<Person1 & Person2>
  • 接口中的属性都变成可选
interface Person{
    age:number
    name:string
}
type PartialRes = Partial<Person>

/*
type PartialRes = {
    age?: number | undefined;
    name?: string | undefined;
}
*/
实现:
interface Person{
    age:number
    name:string
}
type MyPartial<T> = {
    [P in keyof T]?:T[P]
}