乐趣区

关于前端:面试官说说TypeScript类型系统层级

小册

这是我整顿的学习材料,十分零碎和欠缺,欢送一起学习

  • 古代 JavaScript 高级小册
  • 深入浅出 Dart
  • 古代 TypeScript 高级小册
  • linwu 的算法笔记📒

类型零碎层级

TypeScript 的类型零碎是强类型和动态类型的,这为开发者提供了弱小的类型检查和类型平安保障,同时也减少了肯定的学习复杂性。为了更好地了解 TypeScript 的类型零碎,本文将全面介绍其类型零碎层级,包含顶层类型(Top Type)和底层类型(Bottom Type),以及在这个层次结构中如何解决和操作各种类型。了解 TypeScript 的类型零碎层级有助于咱们更好地应用和把握 TypeScript,写出更强壮、可保护的代码。

1. 顶层类型(Top Type)

顶层类型是所有其余类型的父类型,这意味着在 TypeScript 中的任何类型都能够看作是顶层类型的子类型。TypeScript 中有两个非凡的顶层类型:anyunknown

1.1 any 类型

any 类型是 TypeScript 的一个逃生窗口,它能够承受任意类型的值,并且对 any 类型的值进行的任何操作都是容许的。应用 any 类型,能够使咱们绕过 TypeScript 的类型查看。上面的例子展现了 any 类型的灵活性:

let a: any = 123;  // OK
a = 'hello';  // OK
a = true;  // OK
a = {id: 1, name: 'Tom'}; // OK

a.foo();  // OK

咱们能够看到,咱们能够将任何类型的值赋给 any 类型的变量,甚至能够对 any 类型的值进行咱们想要的任何操作,而 TypeScript 编译器并不会对此做出任何投诉。然而,正是因为其超高的灵活性,使得 any 类型在肯定水平上减弱了 TypeScript 的类型安全性,因而在咱们编写 TypeScript 代码时,应尽量避免应用 any 类型。

1.2 unknown 类型

unknown 类型与 any 类型在承受任何类型的值这一点上是一样的,但 unknown 类型却不能像 any 类型那样对其进行任何操作。咱们在对 unknown 类型的值进行操作之前,必须进行类型查看或类型断言,确保操作的安全性。

let u: unknown = 123;  // OK
u = 'hello';  // OK
u = true;  // OK
u = {id: 1, name: 'Tom'}; // OK

// Error: Object is of type 'unknown'.
// u.foo(); 

if (typeof u === 'object' && u !== null) {
  // OK after type check
  console.log((u as { id: number,

 name: string }).name);
}

在这个例子中,咱们对 unknown 类型的值 u 进行了类型查看,而后通过类型断言平安地拜访了其 name 属性。

2. 底层类型(Bottom Type)

与顶层类型绝对,底层类型是所有类型的子类型。这意味着,在类型零碎的层次结构中,任何类型都能够被看作是底层类型的超类型。在 TypeScript 中,never 类型是惟一的底层类型。

never 类型用来示意永远不可能存在的值的类型。比方,一个永远抛出谬误或者永远处于死循环的函数的返回类型就是 never

function error(message: string): never {throw new Error(message);
}

function infiniteLoop(): never {while (true) {}}

在下面的代码中,函数 errorinfiniteLoop 的返回类型都是 never,这是因为这两个函数都永远不会有返回值。

3. 比照:顶层类型 vs 底层类型

顶层类型和底层类型是 TypeScript 类型零碎的两个重要组成部分,它们各自扮演着不同的角色。

顶层类型 anyunknown 可能承受任何类型的值,这使得咱们能够灵便地解决不确定类型的数据。然而,any 类型和 unknown 类型在应用上有着重要的区别:any 类型容许咱们对其进行任何操作,而 unknown 类型则要求咱们在操作之前进行类型查看或类型断言,以确保类型的安全性。

底层类型 never 有点非凡,它示意一个永远不会有值的类型。在理论开发中,咱们可能很少间接应用 never 类型,然而它在 TypeScript 的类型推断和控制流剖析中起着十分重要的作用。

  • 了解 TypeScript 的类型零碎层级有助于咱们编写更强壮、可保护的 TypeScript 代码。只管 any 类型提供了很大的灵活性,然而它的滥用可能会减弱 TypeScript 的类型安全性。因而,咱们应尽量避免应用 any 类型,而优先应用 unknown 类型和类型断言、类型爱护等形式来解决不确定类型的数据。
  • 同时,尽管咱们可能很少间接应用 never 类型,然而了解它的含意和用法,对于咱们了解 TypeScript 的类型推断和控制流剖析也是十分有帮忙的。
退出移动版