返回介绍

Typescript 中的其他类型

发布于 2025-05-03 21:35:25 字数 2824 浏览 0 评论 0 收藏

上面我们认识了 Typescript 中的常见类型,在 Typescript 中,还有一些其他类型

  • 计算机类型系统理论中的顶级类型,如: anyunknown
  • 类型系统中的底部类型,如: never
  • 非原始类型,如: object 、数组和元祖

any

我们可以在需要的时候使用 any 类型来标记一些我们还不确定类型的变量或值,比如不希望类型检查器对这些值进行检查而是直接让它们编译通过

let notSure: any = 4;
notSure = 'manybe a string instead';

any 类型是多人协作项目的大忌,很可能把 Typescript 变成 AnyScript ,通常在不得已的情况下,不应该首先考虑使用此类型

unknown

unknownTypeScript 3.0 引入了新类型,是 any 类型对应的安全类型。

unknownany 的主要区别是 unknown 类型会更加严格:在对 unknown 类型的值执行大多数操作之前,我们必须进行某种形式的检查,而在对 any 类型的值执行操作之前,我们不必进行任何检查。

unknownany 的不同之处,虽然它们都可以是任何类型,但是当 unknown 类型被确定是某个类型之前,它不能被进行任何操作比如实例化、 getter 、函数执行等等

unknown 可以帮我们缩小值的类型范围

function getValue(value: unknown): string {
  // 这里由于把 value 的类型缩小为 Date 实例的范围内,所以`value.toISOString()`
  if (value instanceof Date) { 
    return value.toISOString();
  }

  return String(value);
}

never

never 类型表示的是那些永不存在的值的类型, never 类型是任何类型的子类型,也可以赋值给任何类型;然而,没有类型是 never 的子类型或可以赋值给 never 类型(除了 never 本身之外)。

即使 any 也不可以赋值给 never

两个场景中 never 比较常见:

// 抛出异常的函数永远不会有返回值
function error(message: string): never {
    throw new Error(message);
}

// 空数组,而且永远是空的
const empty: never[] = []

数组

数组有两种类型定义方式,一种是使用泛型:

const list: Array<number> = [1, 2, 3]

另一种使用更加广泛那就是在元素类型后面接上 [] :

const list: number[] = [1, 2, 3]

元组(Tuple)

元组类型与数组类型非常相似,表示一个已知元素数量和类型的数组,它跟数组的区别是各元素的类型不必相同。

比如,你可以定义一对值分别为 stringnumber 类型的元组。

let x: [string, number];
x = ['hello', 10, false] // Error
x = ['hello'] // Error

元组的类型如果多出或者少于规定的类型是会报错的,必须严格跟事先声明的类型一致,即使是顺序错了,也会导致抛出异常

let x: [string, number];
x = ['hello', 10]; // OK
x = [10, 'hello']; // Error

我们可以把元组看成严格版的数组,比如 [string, number] 我们可以看成是:

interface Tuple extends Array<string | number> {
  0: string;
  1: number;
  length: 2;
}

元组继承于数组,但是比数组拥有更严格的类型检查。

Object

object 表示非原始类型,也就是除 numberstringbooleansymbolnullundefined 之外的类型。

// 这是下一节会提到的枚举类型
enum Direction {
    Center = 1
}

let value: object

value = Direction
value = [1]
value = [1, 'hello']
value = {}

我们看到,普通对象、枚举、数组、元组通通都是 object 类型。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。