type k<T> = T extends U ? X : Y T 如果可以分配 给 U 则返回 X 否则返回 Y
实例:type k<T> = T extends number ? string : boolean
可以通过下面这样的条件来筛选联合类型
type a = string | number
type k = T extends string ? never : T
type b = k // number
推断 infer :只能使用在条件类型中 type k<T> = T extends infer R ? R : boolean 这里使用推断返回了 T 自身,但 infer 更多的是用于获取 T 中的某一部分的类型,例如 T 是一个函数的时候 type k<T> = T extends (...arg)=>infer R ? R : T 这里利用 infer 获取 T 的返回值的类型
类型保护 缩小类型范围(我认为这样描述更形象贴切)
in , typeof , instanceof 这三个操作符 ts 都可以自动推断排除操作结果为假的类型
typescript
if("swim" in pet){// 还可以改成 pet.swim ,typeof 也有缩小类型范围的功能
// 在这个范围内 pet 的类型被确认为 Fish 了
}
自定义类型保护:
typescript
function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}