TS的any、unknown、never的区别是什么

164 阅读1分钟

any VS unknown

image.png

二者都是顶级类型(top type),任何类型的值都可以赋值给顶级类型变量:

let foo1:any = 123 //不报错
let foo2:unknown = 123 //不报错

但是unknown比any的类型检查更严格,any检查什么都不做,unknown要求先收窄类型:

const value:unknown = 'Hello World'
const someString:string = value
//报错: Type 'unknown' is not assignable to type 'string'. (2322)
const value:unknown = 'Hello World'
const someString:string = value as string //不报错

如果改成any,基本在哪都不报错。所以用unknown就优先用unknown,类型更安全一点。

never

image.png

never是底类型,表示不应该出现的类型,这里有一个尤雨溪给出的例子:

interface A {
    type:'a'
 }
 
 interface B{
     type:'b'
 }
 
 type All = A | B
 
 function handleValue(val:All){
     switch (val.type){
         case 'a':
             //这里val被收窄为A
             break
         case 'b':
             //val在这里是B
             break
         default:
             //val在这里是never, 出现的意义就是提醒你别在这写代码!
             const exhaustiveCheck: never = val
             break
     }
 }

总结:

顶级类型可以被赋值为任何的东西,底类型就不能被赋值为任何的东西。