unknown 类型
与 any 类型相似之处
与 any 类型相似之处,所有类型也可以赋值给 unknown 类型,因为它也是顶级类型之一
Typescript
let x:unknow
x=true //正确
x=42 // 正确
x='hello world' //正确与 any 不同之处
- unknown 类型的变量,不能直接赋值给其他类型变量,除了(any 类型和 unknown 类型)
Typescript
let x: number;
let y: unknown = 123;
x = y; //不能将类型“unknown”分配给类型“number”。- 不能直接调用 unknown 类型变量的方法和属性
Typescript
let v1: unknown = { a: 1 };
v1.a //“v1”的类型为“未知”。
let v2: unknown = "hello";
v2.trim() //v2的类型为未知
let v3:unknown=()=>{}
v3() //“v3”的类型为“未知”。上面示例中如何 使用unknown类型的变量的属性和方法呢,类型缩小缩小 unknown 变量的类型范围,确保不会出错
Typescript
let v1: unknown = { a: 1 };
if(typeof v1 === 'object'){
(v1 as {a:number}).a
}
let v2: unknown = "hello";
if(typeof v2 === 'string'){
v2.trim()
}
let v3:unknown=()=>{}
if(typeof v3==='function'){
v3()
}
let s:unknown='hello world'
if(typeof s==='string'){
s.length //正确
}上面示例中v1 as {a:number}类型断言,告诉 TS 编译器,v1 中断定一定有{a:number}类型
- unknown 类型变量能够进行的运算是有限的,只能进行比较运算(运算符
==、===、!=、||、&&、?)、 取反运算符!、typeof和instanceof运算符这几种,其他运算符都会报错。
unknonw 与其他类型联合或交叉
- unknown 除了与 any 以外, 与其它任何类型组成的
联合类型最后都是 unknown 类型
Typescript
type x=unknown|string|number // unknown
type y=unknown|any // any- unknown 与其它任何类型组成的
交叉类型最后都是其它类型
Typescript
let x=unknown&string //string
let y=number&unknown // number