>[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'
}
}
~~~
- TypeSprict -- 了解
- TS-- 搭建(一)webpack版本
- TS -- 搭建(二)直接使用
- TS -- 基本类型
- ts -- 类型推导和字面量类型
- ts -- 类型扩展和类型缩小
- ts -- any场景
- ts -- 使用unknown 还是 any
- ts -- any/never/unknown
- ts -- 断言
- ts -- 类型大小写疑惑
- ts -- 数组类型 [] 还是泛型疑惑
- TS -- 枚举
- 外部枚举
- TS -- 函数
- ts -- 重载作用
- ts -- 05 this is
- 解构
- TS -- 接口
- 绕过接口的多余参数检查
- Interface 与 Type 的区别
- TS -- 类
- ts -- 类作为类型
- TS -- 交叉和联合 类型
- ts -- 交叉类型
- ts -- 联合类型
- ts -- 交叉和联合优先级
- ts -- 类型缩减
- TS -- 什么是泛型
- ts -- 泛型函数表达式/函数别名/接口
- ts -- 泛型类
- ts -- extends 泛型约束
- ts -- 泛型new
- ts -- Ts的泛型
- TS -- 缩小类型详解类型守卫
- TS -- 类型兼容性
- TS -- 命名空间与模块化
- ts -- 模块化
- ts -- 命名空间
- TS -- 工具方法
- Record -- 一组属性 K(类型 T)
- Exclude -- 从联合类型中去除指定的类
- Extract -- 联合类型交集
- NonNullable -- 从联合类型中去除 null 或者 undefined
- Partial -- 将所有属性变为可选
- Required -- 所有属性变为必填
- Readonly -- 所有属性只读
- Pick -- 类型中选取出指定的键值
- Omit -- 去除指定的键值