乐趣区

关于前端:现代TypeScript高级教程类型系统层级

点击在线浏览,体验更好 链接
古代 JavaScript 高级小册 链接
深入浅出 Dart 链接
古代 TypeScript 高级小册 链接

类型零碎层级

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 类型的值进行操作之前,必须进行类型查看或类型断言,确保操作的安全性。

上面的例子展现了 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 的类型推断和控制流剖析也是十分有帮忙的。

退出移动版