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的文章。