当前位置: 首页 > ds >正文

TypeScript 中的字面量类型(Literal Types)

在 TypeScript 中,字面量类型(Literal Types)是一种特殊的类型,它允许你将变量的类型限制为某个具体的值(如特定的字符串、数字或布尔值),而不仅仅是宽泛的类型(如 stringnumber)。字面量类型通常与联合类型(Union Types)结合使用,用于创建更精确的类型约束。

一、字面量类型的三种形式

1. 字符串字面量类型

将变量的类型限制为特定字符串值

let direction: "up" | "down" | "left" | "right";
direction = "up";    // ✅ 合法
direction = "north"; // ❌ 错误:不能将类型 'north' 分配给类型 '"up" | "down" | "left" | "right"'
2. 数字字面量类型

将变量的类型限制为特定数值

let httpStatusCode: 200 | 404 | 500;
httpStatusCode = 200; // ✅ 合法
httpStatusCode = 403; // ❌ 错误:不能将类型 '403' 分配给类型 '200 | 404 | 500'
3. 布尔字面量类型

将变量的类型限制为 true 或 false(实际用途较少,因为直接使用 boolean 更常见):

let isDone: true;
isDone = true;  // ✅ 合法
isDone = false; // ❌ 错误:不能将类型 'false' 分配给类型 'true'

二、字面量类型的应用场景

1. 函数参数的精确类型约束
function setAlignment(align: "left" | "center" | "right") {// ...
}setAlignment("center"); // ✅ 合法
setAlignment("justify"); // ❌ 错误
2. 状态机或配置对象
type ButtonState = "enabled" | "disabled" | "loading";const button: { state: ButtonState } = {state: "enabled" // 只能是三种状态之一
};
3. 类型守卫与条件类型

结合类型守卫,根据字面量类型执行不同逻辑:

type Shape = | { kind: "circle"; radius: number }| { kind: "square"; sideLength: number };function getArea(shape: Shape) {if (shape.kind === "circle") {return Math.PI * shape.radius ** 2; // TypeScript 知道 shape 是圆形}// 无需 else 分支,TypeScript 自动推导 shape 是方形return shape.sideLength ** 2;
}

三、字面量类型与联合类型的结合

字面量类型的强大之处在于与联合类型结合,创建更灵活的类型系统:

type ResponseFormat = "json" | "xml" | { custom: string };function fetchData(format: ResponseFormat) {if (typeof format === "string") {// format 是 "json" 或 "xml"} else {// format 是 { custom: string }}
}

四、字面量类型的推断与缩小

1. 类型推断
// 推断为 "hello"(字符串字面量类型)
const greeting = "hello";// 推断为 string(因为变量可重新赋值)
let message = "hello";
message = "world"; // 合法
2. 类型缩小(Type Narrowing)

通过条件判断将宽泛类型缩小为字面量类型:

function printID(id: number | string) {if (typeof id === "string") {console.log(id.toUpperCase()); // id 被缩小为 string 类型} else {console.log(id.toFixed(2));    // id 被缩小为 number 类型}
}

五、字面量类型的进阶用法

1. 模板字面量类型(Template Literal Types)

基于字符串字面量组合出新的类型:

type Color = "red" | "blue";
type Size = "small" | "large";
type ProductID = `${Color}-${Size}`; // "red-small" | "red-large" | "blue-small" | "blue-large"
2. 字面量类型与枚举(Enum)的对比
  • 枚举:编译后存在于运行时,可被修改。
  • 字面量类型:仅存在于类型系统,编译后消失,更轻量。
// 枚举
enum Direction { Up, Down, Left, Right }
const d: Direction = Direction.Up;// 字面量类型
type DirectionLiteral = "up" | "down" | "left" | "right";
const dl: DirectionLiteral = "up";

总结:字面量类型的核心价值

  • 精确性:将变量类型约束到具体值,增强类型安全性。
  • 可读性:代码中明确声明允许的值,减少歧义。
  • 与其他特性结合:联合类型、条件类型、模板字面量类型等,构建复杂类型系统。
http://www.xdnf.cn/news/11036.html

相关文章:

  • 什么是 Docker Compose 的网络(network),为什么你需要它,它是怎么工作的
  • 词语翻译的三步法与背后的语言学思维
  • R²AIN SUITE AI知识库助力中国制造业数字化转型
  • ABAP设计模式之---“高内聚,低耦合(High Cohesion Low Coupling)”
  • 嵌入式学习 D31:系统编程--Framebuf帧缓冲
  • java实用类
  • 【Agent智能体】吴恩达:AI智能体发展现状 | LangChain访谈--快速总结
  • 电脑远程桌面连接如何设置端口?默认修改和内网给外网访问方法
  • ArkUI-X中Plugin生命周期开发指南
  • 不连网也能跑大模型?
  • 手机上网可以固定ip地址吗?详细解析
  • Ubuntu22.04 安装 Miniconda3
  • python直方图
  • 【前端并发请求控制:必要性与实现策略】
  • 为何选择Spring框架学习设计模式与编码技巧?
  • 从“remote rejected”看git角色区别,Maintainer和Devoloper
  • 使用 Docker Compose 安装 Redis 7.2.4
  • Python基于PCA、PCA-kernel、LDA的同心圆数据降维项目实战
  • 2005-2022全国及各省家庭承包耕地流转总面积及经营耕地面积数据(无缺失)
  • 移动网页调试的多元路径:WebDebugX 与其他调试工具的组合使用策略
  • HarmonyOS Next 弹窗系列教程(2)
  • matlab实现掺杂光纤放大器的模拟
  • uniapp开发使用vue3组合式api,实现从vue模块中自动导入
  • Flotherm软件许可与硬件要求
  • 我的技术笔记
  • 《汇编语言》第14章 端口
  • Python Day41学习(日志Day8复习)
  • 基于蝙蝠算法的路径优化
  • Python语法基础篇(包含类型转换、拷贝、可变对象/不可变对象,函数,拆包,异常,模块,闭包,装饰器)
  • 对比ODR直接赋值的非原子操作和BSRR原子操作