any VS unknown
二者都是顶级类型(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
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
}
}
总结:
顶级类型可以被赋值为任何的东西,底类型就不能被赋值为任何的东西。