any
和unkown
属于ts中最顶层的类型,所有的类型都是它们的子类型;never
与之相反,是ts的底部类型。
any
任意类型的值都可以赋值给any
类型,同时可以获取any
类型的任何属性。
let something: any = "hello" something = 18; something = true; // 获取 any类型的属性 something.run();
通常在代码迁移、不关心数据类型或类型缺失的情况下使用any
,但还是应该想办法避免出现any
,因为any
跳过了类型检查,会给我们带来一些潜在的问题。
unknown
和any
一样,任何类型都可以赋值给unknown
,但是unknown
不能给非unknown
或any
类型
let foo: any = "hello" let bar: unknown = "hello"; let name: string = foo; let age: number = bar; // 报错: Type 'unknown' is not assignable to type 'number'
如果要将unknown
赋值给其他类型,要先推断变量的类型,比如typeof
、as assertion
、type guard
等方式
let bar: unknown = "hello"; let list: unknown = [1]; if (typeof bar === "number") { let age: number = bar; // 报错: Type 'unknown' is not assignable to type 'number' } if (Array.isArray(list)) { let list2: number[] = list; }
never
TypeScript
中什么是类型?
类型是一组集合的子集,例如,string
类型表示无限多个可能存在的字符串子集,当我们用 string
类型来标注一个变量的时候,这个变量只应该是该集合内的子集,即字符串:
let bar: string = 'bar' bar = 3 // ❌ 数字不属于字符串的子集
在 TypeScript 中,never
本质就是一个空集,由于集合中没有值,never
类型字面意义地永远不会有任何值,包括 any
类型也不在 never
这个空集中。这就是为什么 never
有时也被称为 uninhabited 类型或 Bottom 类型。
never
可能出现的地方
- 函数的返回类型,当函数运行之后从不返回的情况
- 在条件分支中一个永远不可能进入的 分支
- 被拒绝的Promise类型
这里有篇介绍never的文章。