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