前端面试题库

any、unkonwn、never

更新时间:2024-08-23 15:20:36

答案

anyunkown属于ts中最顶层的类型,所有的类型都是它们的子类型;never与之相反,是ts的底部类型。

any

任意类型的值都可以赋值给any类型,同时可以获取any类型的任何属性。

let something: any = "hello" something = 18; something = true; // 获取 any类型的属性 something.run();

通常在代码迁移、不关心数据类型或类型缺失的情况下使用any,但还是应该想办法避免出现any,因为any跳过了类型检查,会给我们带来一些潜在的问题。

unknown

any一样,任何类型都可以赋值给unknown,但是unknown不能给非unknownany类型

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赋值给其他类型,要先推断变量的类型,比如typeofas assertiontype 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可能出现的地方

  1. 函数的返回类型,当函数运行之后从不返回的情况
  2. 在条件分支中一个永远不可能进入的 分支
  3. 被拒绝的Promise类型

这里有篇介绍never的文章

评论