外观
231211-231215
作者:guo-zi-xin
更新于:9 个月前
字数统计:616 字
阅读时长:2 分钟
23-12-13 ❄️
Typescript中any
与unknown
any
any
类型表示没有任何限制,该类型的变量可以赋予任意类型的值。一旦设置为
any
类型, TypeScript 实际上会关闭这个变量的类型检查。即使有明显的类型错误,只要句法正确,都不会报错。any
类型由于跳过了类型检查,它可以随意赋值, 所以可能会带来变量的污染unknown
unknown
是 TypeScript 3.0 引入的类型,它代表了一个未知的类型。unknown
类型要求进行类型检查和类型断言,以便在使用前确定其实际类型。unknown
类型不能够直接使用, 而any
类型是可以的typescript// unknown类型赋值给除了 unknown 和 any 类型不会报错, 其它都会报错 let known: unknown = 123; let known1 :boolean = v; // 报错 let known2 :number = v; // 报错
unknown
类型也不能够直接调用上面的方法和属性typescriptlet known: unknown = { foo: 123 }; known.foo // 报错 let known2: unknown = 'hello' known2.trim() // 报错 let known3: unknown = ( n = 0 ) => n + 1 known3() // 报错
unknown
类型变量能够进行的运算是有限的, 只支持比较运算: 运算符==
、===
、!=
、!==
、||
、&&
、?
; 取反运算!
、typeof
运算符和instance
运算符这几种, 其它都会报错typescriptlet aa: unknown = 1 a + 1 // 报错 a === 1 // 不报错 返回true
unknown
使用位置
我们可以通过类型守卫(typeof
、instanceof
操作符这些)来限制类型范围, 在操作符的加持下, 我们就可以使用unknown
类型变量
typescript
let aa:unknown = 1
if (typeof aa === 'number') {
let bb = aa + 10 // 可以正常运行
}
Typescript中的never
类型
为了保持与集合论的对应关系,以及类型运算的完整性,TypeScript 还引入了“空类型”的概念,即该类型为空,不包含任何值
使用场景
主要是在一些类型运算中,保证类型的完整性,例如在一个联合类型中, 通过类型守卫进行类型范围缩小后,剩余的情况就是
never
类型typescriptconst fun = (value: string | number) => { if (typeof value === 'string') { // 此时为 string 类型 } else if (typeof value === 'number') { // 此时为 number 类型 } else { // 此时为 never 类型 } }
never
类型可以复制给任意其它类型
typescript
const fun1 = ():never => {
throw new Error('Error')
}
let aa: number = fun1() //正常运行
let bb: string = fun1() //正常运行
let cc: boolean = fun1() //正常运行
Typescript中有两个 "顶层类型" (any
与unknown
), 只有一个"底层类型"(never
)