ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
>[success] # ts -- 类型扩展和类型缩小 ~~~ 1.字面量章节时候发现let 在没有定义类型时候会自动向上找对应的父级类型,但最终还是属于同一类型之间的升级 2.另外一种是类型扩展即类型升级到其他类型 其中'null' 和'undefined' 两个为代表 3.相对的有扩展类型就是有缩小类型范围,将大类型集合逐步精准到小类型上这种就叫'类型缩小' ~~~ >[danger] ##### 类型扩展 ~~~ 1.通过 let、var 定义的变量如果满足未显式声明类型注解且被赋予了 null 或 undefined 值,则推断出这些变量的类型是 any ~~~ ~~~ let x = null // 类型拓宽成 any let y = undefined // 类型拓宽成 any ~~~ ![](https://img.kancloud.cn/4d/12/4d12d54d8455867ec18eb536309343e4_379x116.png) * const 不吃这一套 ~~~ const z = null // 类型是 null ,const 会字面量找到自己当前的 ~~~ * let定义值被赋值(strictNullChecks=true 被开启) ~~~ let x = null // 类型拓宽成 any let x2 = x // 类型是 null 开启后赋值 ~~~ ![](https://img.kancloud.cn/ca/c6/cac68f0b35a352d78f83c8430c1f518a_453x122.png) >[danger] ##### 缩小类型 ~~~ 1.虽然function 接受的参数是any 但是通过if 流程语句缩小了范围,最后func 推导的返回类型不在是any 而是更准确的联合类型 当然除了if 类似或其他控制流语句(三目运算符、switch 分支)等都可以 ~~~ ~~~ let func = (anything: any) => { if (typeof anything === 'string') { return anything // 类型是 string } else if (typeof anything === 'number') { return anything // 类型是 number } return null } ~~~ ![](https://img.kancloud.cn/79/28/792804fed2a6cfdb29871bde6d42ab35_575x256.png) * 案例 ~~~ type Goods = 'pen' | 'pencil' | 'ruler' const getPenCost = (item: 'pen') => 2 const getPencilCost = (item: 'pencil') => 4 const getRulerCost = (item: 'ruler') => 6 const getCost = (item: Goods) => { if (item === 'pen') { return getPenCost(item) // item => 'pen' } else if (item === 'pencil') { return getPencilCost(item) // item => 'pencil' } else { return getRulerCost(item) // item => 'ruler' } } ~~~ ![](https://img.kancloud.cn/cb/99/cb9982b57f57b684d4d3c8084f0028a1_567x466.png) * 案例 ~~~ const getCost = (item: Goods) => { if (item === 'pen') { item; // item => 'pen' } else { item; // => 'pencil' | 'ruler' } } ~~~