交叉类型
两个对象创建一个新对象拥有两个对象类型。
interface IAnyObject{[prop:string]:any}function mixin<T extends IAnyObject,U extends IAnyObject>(first:T,second:U):T&U{const result =<T&U>{}for (let key in first){(<T>result)[key]=first[key]}for (let key in second){if(!result.hasownProperty(key)){(<U>result)[key]=second[key]}}return result}
联合类型
类型别名
索引类型
映射类型
in 一般用来重写属性。 [ key in keys ]
k:类型变量
keys:联合类型
自带遍历
// 加一个可选类型[k in key of T]?:T[K]
条件类型
// 三目T extends U ?X:Y
裸类型参数
type NakedUsage<T> = T extends boolean ? "YES" : "NO"type Distributed = NakedUsage<number | boolean >// = NakedUsage<number> | NakedUsage<boolean> = "NO" | "YES"
非裸类型参数
type WrappedUsage<T> = [T] extends [boolean] ? "YES" : "NO";// wrapped in a tuple 包在元组里面type NotDistributed = WrappedUsage<number | boolean > // "NO"type NotDistributed2 = WrappedUsage<boolean > // "YES"
巧用never类型和条件类型来筛选类型
infer
infer P 代表待推断的函数参数
- infer 用于提取函数类型的返回值类型
- 用于提取构造函数(实例)参数类型
构造函数 infer p p可以数组参数type param<T> = T extends (...arg:infer P)=>any?P:Tinterface User{name:stringage:string}type Fun=(user:User)=>voidtype Params=param<Fun> // Usertype AA =param<string> // string
元数组转联合类型
联合类型转交叉类型type Element of<T>= T extends Arrary<infer E>?E:never
仅当条件类型是裸类型的时候才会分布 多用于混入
