为了解决any类型的污染问题,引入了unkown类型、它与any类型的相似之处在于,所有类型的值都可以分配给unkown类型。
let x:unknown; x = true; // 正确 x = 42; // 正确 x = 'Hello World' // 正确
它们的不同之处在于:
1、unknown类型的变量,不能直接赋值给其它类型的变量(除了any类型和unknown类型)
let v:unknown = 123; let v1:boolean = v // 报错 let v2:number = v // 报错
2. unkown类型的变量不能直接调用方法和属性
let v1:unknown = {foo:1} v1.foo // 报错 let v2:unknown = 'hello' v2.trim() // 报错 let v3:unknown = (n=0)=>n+1 v3() // 报错
如上,连直接当做函数执行也不行。
。。既然这样,那unknown的作用是什么呢?就是为了替代any类型,或者或,更严格的any类型。意思就是声明的变量可以是任何类型。但是又不能调用方法和属性,感觉没啥用。
迁移旧的项目,或者哪个变量想暂时关闭类型检查都可以用。
3. unknown类型变量能够进行的运算是有限的。加减乘除这些都不能进行。
let a:unknown = 1; a + 1 // 报错 a === 1 // 正确
想要进行这些运算只有经过‘类型缩小’才可以
let a:unknown = 1; if (typeof a === 'number') { let r = a + 10; // 正确 }
let s:unknown = 'hello'; if (typeof s === 'string') { s.length; // 经过类型缩小后,也可以使用字符串的方法了 }
二、never类型
never类型也称为“空类型”,及不包含任何值
let x:never;
给never类型的变量,赋给它任何值都会报错。
它的使用场景:
1. 在类型运算中,保证类型的完整性
2.不可能返回值的函数,返回值的类型就可以写成never。
never类型的一个重要特点是可以赋值给任意其他类型
let x:never; let x1:string = x // 不报错 let x2:number = x // 不报错 let x3:boolean = x // 不报错
为什么never类型可以赋值给任意其他类型呢?这跟集合论有关,空集是任何集合的子集。TS规定,任何类型都包含了never类型
总之,TS有两个“顶层类型”(any和unknown),但是“底层类型”只有never唯一一个。
any 类型,unknown 类型,never 类型 - TypeScript 教程 - 网道 (wangdoc.com)
标签:unknown,never,TS,笔记,学习,let,类型,报错,any From: https://www.cnblogs.com/yaoyu7/p/18446143