TS初学笔记

85 阅读2分钟

Typescript

extends 条件类型是一种条件表达式进行类型的关系检测。

Omit 通过泛型删除指定属性

interface UserInfo {

    name:string;

    age:number;

}

// 这时候我们不需要 UserInfo 的 name 属性。

type UserInfoT = Omit<UserInfo, "name">

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

Pick 通过泛型选择指定属性形成新的类型, 从一个 Type 中选取一些属性来构造一个新的对象 Type

interface UserInfo { name:string; age:number; } 

// 这时候我们只需要 UserInfo 的 name 属性。 

type UserInfoT = Pick<UserInfo, "name">

Partial 通过泛型让目标类型中的所有属性变为可选

Infer 在条件类型表达式中,可以在 extends 条件语句中使用 infer 关键字来声明一个待推断的类型变量。infer 只能用于 extends 语句中

ReturnType 获取函数返回值类型

const add = (x:number, y:number) => x + y

type t = ReturnType // type t = number

**readonly **将一个类型的属性全部变为只读状态

const foo:Readonly = 

     name:"张三",

    age:18

}

Record 用于方便地构造一个字面量对象。其作用和 { [propName:string]:any } 有些许类似

type UserInfoT = Record<"name" | "age", string | number>

上面说的 Omit 和 Pick 都是对一个字面量对象 Type 的操作。如果要对一个联合类型操作的话需要用到 Exclude 和 Extract

Exclude 排除一个联合类型中的某一些类型来构造一个新 Type

type Exclude<T, U> = T extends U ? never : T;

// 排除掉 "name"

type UserInfoT = Exclude<"name" | "age", "name">;

// 等价于

type UserInfoA = "age";

Extract 提取出一个联合类型中的某一些类型来构造一个新 Type

type Extract<T, U> = T extends U ? T : never;

// 从 T1 中 提取出 T2 

type T1 = "name" | "age" | "hob"; 

type T2 = "name" | "age"; 

type UserInfoT = Extract<T1, T2>; 

// 等价于 

type UserInfoA = "name" | "age";

// 这样可以保证 UserInfoT 的类型一定是在 T1 中存在的;

NonNullable 从类型中排除 null 和 undefined 来构造一个新的 Type

// 从 UserInfoK 中 排除掉 null | undefined 

type UserInfoK = NonNullable<"name" | "hob" | undefined>; 

// 等价于

type UserInfoKA = "name" | "hob";

Parameters 从 [函数 Type] 的形参构造一个数组 Type

type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;

  // infer标识一个待推导类型,上面定义的意思是:如果 T 为函数类型,那就返回函数的形参。

// 定义一个函数

function getUserInfo(id:string, group:string){}

// 获取到函数需要的形参 Type[]

type GetUserInfoArg = Parameters;

   

const arg:GetUserInfoArg = [ "001", "002" ];

getUserInfo(...arg);