Typescript在什么场景下使用as const?

开发 前端
as const​ 是 TypeScript 中的一种类型断言,用于将一个对象或数组的所有属性标记为只读(readonly​),并将其所有字面量类型提升为最窄的字面量类型(即常量类型)。

as const 是 TypeScript 中的一种类型断言,用于将一个对象或数组的所有属性标记为只读(readonly),并将其所有字面量类型提升为最窄的字面量类型(即常量类型)。这在需要确保某些值不被修改(immutable)、或在处理与严格类型检查相关的场景时非常有用。

场景1: 定义不可变的常量对象或数组

as const 可以将对象或数组标记为只读,从而防止在后续代码中对其进行修改。

const colors = {
    red: "#FF0000",
    green: "#00FF00",
    blue: "#0000FF"
} as const;

// colors.red = "#FFF000"; // Error: Cannot assign to 'red' because it is a read-only property.

在上面的例子中,colors 对象的所有属性都被标记为只读,因此不能对它们进行修改。

场景2: 确保字面量类型而不是更宽泛的类型

在没有 as const 的情况下,TypeScript 会将字面量类型推断为更宽泛的类型。例如,一个数组中的字符串字面量会被推断为 string[],而不是具体的字符串字面量类型。

const directions = ["up", "down", "left", "right"] as const;

// directions 的类型是 readonly ["up", "down", "left", "right"]

如果没有 as const,directions 的类型会被推断为 string[],而使用了 as const 后,类型会被推断为 readonly ["up", "down", "left", "right"],即一个只读的元组,包含具体的字面量类型。

场景3: 减少类型检查错误

在某些情况下,使用 as const 可以减少类型检查时的错误,特别是在与 enum 或 switch 语句配合使用时。例如,当你传递一个数组中的元素到一个函数时,如果数组的元素类型太宽泛,可能会导致不符合预期的类型检查错误。

function move(direction: "up" | "down" | "left" | "right") {
    console.log(`Moving ${direction}`);
}

const directions = ["up", "down", "left", "right"] as const;

// Without `as const`, this would cause a type error
move(directions[0]); // OK

场景4: 使用联合类型

当你希望一个对象的属性值作为联合类型使用时,as const 可以确保类型推断为最窄的字面量类型。例如,在创建包含固定字符串的配置对象时。

const config = {
    environment: "production",
    version: "1.0.0"
} as const;

type Env = typeof config.environment; // "production"

总结

  • 防止修改: 当你希望对象或数组中的值是不可变的。
  • 确保最窄类型: 当你希望确保字面量类型推断为最窄的类型。
  • 减少类型检查错误: 当与其他类型系统(如联合类型、switch 语句)配合时,确保类型推断正确。

使用 as const 可以提高代码的类型安全性,并在 TypeScript 中增强类型推断的精确性。

责任编辑:武晓燕 来源: 一码平川
相关推荐

2023-09-03 22:46:27

数据库PostgreSQL

2023-11-28 13:52:00

Python多进程多线程

2022-07-12 14:04:19

Kafka

2023-09-26 22:37:16

C++const

2023-11-09 09:02:26

TypeScriptas const

2019-08-12 16:22:07

Python线程场景

2022-03-23 09:52:28

LambdaAWS服务

2023-12-26 09:42:41

存储数据库

2023-11-30 09:00:00

TypeScript开发

2009-07-07 18:45:00

PONFTTX组网

2024-09-11 19:36:24

2018-11-22 13:37:49

HBase人工智能数据

2020-11-18 09:26:52

@property装饰器代码

2022-03-03 23:30:27

TypeScrip开发前端

2023-07-04 15:11:30

TypeScript类型保护

2019-07-05 17:40:24

MySQL并发数据库

2018-05-04 15:15:37

数据库MySQL并发场景

2017-10-30 16:50:41

Linuxconst

2022-10-17 00:27:20

二叉树数组索引

2011-03-28 10:42:00

Spring
点赞
收藏

51CTO技术栈公众号