any 和 unknown
any 和 unknown 都是 ts 中的顶级类型(top type),任何类型的值都可以赋值给顶级类型,但顶级类型是否可以赋值给任意值?
unknown 是 typescript 3.0 才引入的类型,为的就是解决 any 没有检查的问题,让顶级类型也有校验和检查。
二者的区别用语言不好描述,这里以一个例子为例解释二者的区别:
任何类型的值都可以赋值给 any 和 unknown
let a: any = "a string"
let a: any = 123;
let a: any = true;
...
let a: unknown = "a string"
let a: unknown = 123;
let a: unknown = true;
...
unknown 的值不能随意赋与给任何值
let a: any = "hello";
let b: string = a; // 不报错
let a: unknown = "hello";
let b: string = a; // 报错 Type 'unknown' is not assignable to type 'string'
如何正确使用 unknown 值?
unknown 类型的值在使用时需要先进行类型收窄处理。有以下两种方式。
- 使用 typeof 或 instanceof 进行判断后使用 ```typescript let a: unknown = “hello”; let b: string;
if(typeof a === “string”) { b = a; }
2. 使用强制类型转换(必须要在确实知道此时的值的类型,否则容易出问题)
```typescript
let a: unknown = "hello";
let b: string = a as string;
因此,在 any 和 unknown 都可以的情况下要优先用 unknown, ts 在设计出 unknown 的目的也是为了替代 any 类型的。
never 类型
never 是底类型,never 可以赋值给任何类型。但所有的值都不能赋值给 never 类型。
never 类型表示永远不可到达的类型。
interface A {
type: "A"
}
interface B {
type: "B"
}
type All = A | B
function handleValue(val: All) {
switch(val.type) {
case "A":
break;
case "B":
break;
default:
let b: never = val; // 这里就是 never
break;
}
}