指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub

ts中const分析:

例子:

const timezonesMap = {
  1: "Europe/Berlin",
  2: "America/New_York",
  3: "Asia/Shanghai"
} as const;

1.在 TypeScript 中,as const 是一种常见的类型断言,它用于将一个对象的 字面量值 转换为一个 更具体的类型,而不仅仅是其类型的宽泛表示。

你提到的例子:

const timezonesMap = {
  1: "Europe/Berlin",
  2: "America/New_York",
  3: "Asia/Shanghai"
} as const;

这里的 as const 是必须的,因为它会改变 timezonesMap 的类型推断,确保 TypeScript 将对象的值保持为字面量类型,而不是更宽泛的类型。让我们逐步分析一下:

1. const 关键字的作用

使用 const 声明的变量会使该变量 不可重新赋值,即它是常量。但它不会影响对象的 属性类型。即使你用 const 声明一个对象,TypeScript 依然会将该对象的值推断为 可变的类型,例如字符串。

没有 as const 的情况

const timezonesMap = {
  1: "Europe/Berlin",
  2: "America/New_York",
  3: "Asia/Shanghai"
};

TypeScript 会推断出 timezonesMap 的类型如下:

{
  1: string;
  2: string;
  3: string;
}

这意味着 timezonesMap[1] 可以是任何字符串,而不是限定为 "Europe/Berlin"。它会推断为一个 宽泛的 string 类型。

2. as const 的作用

当你添加 as const 后,TypeScript 会将 timezonesMap 中的所有属性值的类型推断为 字面量类型,而不是 string 类型。这就使得每个属性的类型更加精确,变成了具体的字符串值。

const timezonesMap = {
  1: "Europe/Berlin",
  2: "America/New_York",
  3: "Asia/Shanghai"
} as const;

在这种情况下,timezonesMap 的类型将被推断为:

{
  1: "Europe/Berlin";
  2: "America/New_York";
  3: "Asia/Shanghai";
}

这意味着 timezonesMap[1] 的类型是 "Europe/Berlin",timezonesMap[2] 的类型是 "America/New_York",而不是通用的 string 类型。

3. 为什么需要 as const?

  • 没有 as const:对象的值会被推断为更宽泛的类型(例如 string),允许你将任何字符串赋给这些属性。
  • 使用 as const:对象的值会被推断为字面量类型,这样可以确保值的精确性,并避免值被误用为其他类型。

示例对比

没有 as const(普通的 const)

const timezonesMap = {
  1: "Europe/Berlin",
  2: "America/New_York",
  3: "Asia/Shanghai"
};

// 这里 timezonesMap[1] 被推断为 string 类型
timezonesMap[1] = "Europe/Paris";  // 这是允许的,因为它的类型是 string

使用 as const

const timezonesMap = {
  1: "Europe/Berlin",
  2: "America/New_York",
  3: "Asia/Shanghai"
} as const;

// 这里 timezonesMap[1] 被推断为 "Europe/Berlin" 字面量类型
timezonesMap[1] = "Europe/Paris";  // 这是错误的,因为类型是 "Europe/Berlin",不能赋值为其他字符串

总结

as const 的作用是让 TypeScript 更严格地推断对象的属性类型,并使属性值保持字面量类型,而不是推断为更宽泛的类型(如 string)。这样做的好处是能够在类型层面确保值的准确性和可预测性,避免赋值错误。

2.对于 const timezonesMap 是不可变的, const 使得变量 不可重新赋值,但它并不会使对象的属性变成 不可变。在 TypeScript 中,const 关键字只是确保变量本身不可重新赋值,而不会影响该对象的内部结构或属性类型。

3.as const 和 const 是两个不同的概念,目的也不同: const 让变量不可重新赋值,但不会影响对象的属性类型。 as const 会将对象的属性值的类型转为字面量类型(literal type),从而使得对象的属性值更加严格,不能再随意修改成其他值。