classKeyCls{name: string
age: number
}
type KeyClsExample1 = keyof KeyCls // name | agefunctiongetParams(params: keyof KeyCls){}getParams('name')// 正常getParams('age')// 正常getParams('sex')// 报错
in 可以遍历枚举类型
type Keys ='a'|'b'
type Obj ={[p in Keys]: any;}// type Obj = {// a: any;// b: any;// }
extends
type TExtends<T,U>=TextendsU? number : never;
type TExtendExample = TExtends<number, number | string>// number// 联合类型, 表示如果T中的类型是U的子集, 那么返回never, 否则返回T, 这个过程可以理解为对T中的类型进行一次遍历, 每个类型都执行一次extends
type NonNullable1<T,U>=TextendsU? never :T
type NonExample = NonNullable1<null| string,null|undefined>// string
Pick 英文意思挑选, 也就是从某种类型中挑选出一个或多个属性
interfaceTodo{title: string
desc: string
Done: boolean
}
type TodoPreview = Pick<Todo,'Done'>// type TodoPreview = {// Done: boolean;// }// 实现
type MyPick<T,KextendskeyofT= keyof T>={[PinK]:T[P]}// K in extends keyof T = keyof T, 意思是取值必须是在T的key上面取, 如果不传递取值默认为keyof T,所有的key, 内部取值是如果传递了K, 则属性就在K中任意一个
// 已经学习了Pick和Exclude, 则可以利用这两个实现OmitclassKeyCls{name: string;age: number;}// 假设 T 为 KeyCls, K为name, 结果是 // type myOmit<KeyCls, 'name'>// { // age: number; // }// 只需要实现成这样就行了, 也就是获取到age
type myOmit<T,KextendskeyofT>= Pick<T,'age'>// 排除name, 按照上面的 Exclude<'name' | 'age', 'name'> // 'age'
type myOmit<T,KextendskeyofT>= Pick<T, Exclude<keyof T,K>>// 测试
type myOmitExample = myOmit<KeyCls,"name">;// type myOmitExample = { // age: number; // }
NonNullable:作用是去掉 T 中的 null 和 undefined。T 为字面量/具体类型的联合类型
// 4.8版本之前
type NonNullable<T> = T extends null | undefined ? never : T;
// 4.8版本之后
type NonNullable<T> = T & {}
infer 可以推荐一个类型变量, 相当于生命一个类型变量, 这个变量的类型取决于传入的泛型T
type F<T>=Textends()=> infer R?R:T;
type F1=F<string>// string
type TObj<T>=Textends{name: infer V,age: infer U}?V:T
type TObjExample2 = TObj<{name: number;age: string;}>;// number;
ReturnType 获取函数返回值的类型
type ReturnType<T>=Textends(...args: any[])=> infer R?R: any;
functin getUser(){return{name:'xxx',age:20}}
type GetUserType =typeof getUser;// type GetUserType = () => {// name: string;// age: number;// }
type ReturnUser = ReturnType<GetUserType>
type ReturnUser ={// name: string;// age: number;// }