TypeScript小技巧使用as const:让类型推断更精准。

文章目录

    • 前言
    • 什么是 as const?
    • 为什么需要 as const?
    • as const的使用场景
      • 1. 保留字面量类型
      • 2. 处理元组类型
      • 3. 函数调用中的类型匹配
    • 实际应用示例
      • 示例 1:配置对象
      • 示例 2:枚举替代方案
    • 总结


前言

作为一名前端开发者,在日常开发中,我们常常需要处理各种数据结构,并确保类型系统的正确性。TypeScript 的类型系统为我们提供了强大的工具来捕捉潜在的错误,而 as const 则是其中一个非常实用但可能被忽视的特性。今天,我将和大家分享如何利用 as const 来优化我们的类型推断,避免常见的类型错误。

什么是 as const?

as const 是 TypeScript 中的一个类型断言(Type Assertion),它的作用是告诉编译器将某个值视为一个常量(不可变的)类型。这种断言会阻止 TypeScript 对类型进行宽化(widening),从而保留更精确的类型信息。

为什么需要 as const?

在 TypeScript 中,默认情况下,它会根据变量的初始化值来推断类型。然而,这种推断有时会过于宽泛,导致我们失去一些有用的类型信息。例如:

	const user = {name: "John",age: 30,};// TypeScript 推断的类型是:// { name: string; age: number; }

在这个例子中,name 被推断为 string,而 age 被推断为 number。虽然这在大多数情况下是正确的,但如果你希望 name 的类型是字面量 "John" 而不是通用的 string,默认的类型推断就无法满足需求。

as const的使用场景

1. 保留字面量类型

通过使用 as const,我们可以让 TypeScript 推断出更具体的类型:

	const user = {name: "John",age: 30,} as const;// 现在,TypeScript 推断的类型是:// { readonly name: "John"; readonly age: 30; }

在这里,name 的类型被精确为 "John",而不是 string,同时对象的属性也变成了只读的。

2. 处理元组类型

as const 在处理数组时也非常有用,特别是当你希望将数组视为元组(tuple)而不是普通的数组时:

	const tuple = [1, "two", true] as const;// TypeScript 推断的类型是:// readonly [1, "two", true]

没有 as const,TypeScript 会将 [1, "two", true] 推断为 (number | string | boolean)[],这会导致类型不匹配的问题,尤其是在函数参数期望元组类型时。

3. 函数调用中的类型匹配

假设你有一个函数,它期望接收一个元组作为参数:

	function processTuple(tuple: readonly [number, string, boolean]) {console.log(tuple);}const tuple = [1, "two", true] as const;processTuple(tuple); // 正确

如果没有 as const,TypeScript 会将数组推断为 (number | string | boolean)[],从而导致类型错误,因为 processTuple 期望的是一个元组类型。

实际应用示例

示例 1:配置对象

假设你有一个配置对象,希望某些字段的值是特定的字面量:

	const config = {endpoint: "https://api.example.com",timeout: 3000,debug: true,} as const;// 现在 config 的类型是:// { readonly endpoint: "https://api.example.com"; readonly timeout: 3000; readonly debug: true; }

这样,TypeScript 会确保 endpoint 的值只能是 "https://api.example.com",而不是任何 string

示例 2:枚举替代方案

如果你需要一组固定的字符串值,但又不想使用 enum,可以用 as const 来实现:

	const Status = {Pending: "PENDING",Success: "SUCCESS",Failure: "FAILURE",} as const;type Status = typeof Status[keyof typeof Status]; // "PENDING" | "SUCCESS" | "FAILURE"

这样,Status 的值被限制为特定的字面量类型,而不是 string

总结

as const 是一个简单但强大的 TypeScript 特性,它可以帮助我们:

  • 防止类型宽化,保留更精确的类型信息。
  • 将数组推断为元组类型。
  • 使对象属性变为只读,避免意外的修改。

在日常开发中,合理使用 as const 可以显著提高代码的类型安全性,减少潜在的错误。希望今天的分享能够帮助你更好地理解和使用 as const,从而写出更健壮的 TypeScript 代码!

如果你有任何问题或想法,欢迎在评论区留言交流。让我们一起在 TypeScript 的世界里探索更多可能性!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/326.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LangGraph-agent-天气助手

用于创建agent和多代理工作流 循环(有迭代次数)、可控、持久 安装langgraph包 conda create --name agent python3.12 conda activate agent pip install -U langgraph pip install langchain-openai设置 windows(>结尾) s…

十三种通信接口芯片——《器件手册--通信接口芯片》

目录 通信接口芯片 简述 基本功能 常见类型 应用场景 详尽阐述 1 RS485/RS422芯片 1. RS485和RS422标准 2. 芯片功能 3. 典型芯片及特点 4. 应用场景 5. 设计注意事项 6. 选型建议 2 RS232芯片 1. RS232标准 2. 芯片功能 3. 典型芯片及特点 4. 应用场景 5. 设计注意事项 6…

9大开源AI智能体概况

项目GitHub 链接开发组织核心功能应用领域典型应用案例活跃度AutoGPT (176k⭐)链接Significant Gravitas 团队基于 GPT-4 的自主代理,能够自动分解任务并生成多步提示循环执行,支持调用工具(如网络搜索、文件操作等)。自动化办公、…

kafka吞吐量提升总结

前言 原本自以为阅读了很久kafka的源码,对于kafka的了解已经深入到一定程度了,后面在某大厂的面试中,面试官询问我,如果需要提升kafka的性能,应该怎么做,我发现我能答上来的点非常的少,也暴露了…

OpenHarmony外设驱动使用 (十三),Vibrator

OpenHarmony外设驱动使用 (十三) Vibrator 概述 功能简介 为了快速开发马达驱动,基于HDF(Hardware Driver Foundation)驱动框架开发了马达(Vibrator)驱动模型。马达驱动模型,屏蔽…

【Harmony OS】作业四 布局

目录 一. 单选题(共6题,6分) 1. (单选题, 1分)关于容器组件 Row 和 Column,下面说法错误的是? 2. (单选题, 1分)下列哪种组合方式可以实现子组件从父子组件单向状态同步? 3. (单选题, 1分)下面哪个组件层次结构是错误的&…

嵌入式学习Day27

进程: 进程是操作系统中的一个基本概念,指的是正在执行的程序实例。每个进程都有独立的内存空间、系统资源和执行状态。操作系统通过进程管理来分配资源、调度任务和确保系统的稳定性。 进程的组成 代码段:存储程序的指令。数据段&#xf…

《数据结构初阶》【八大排序——巅峰决战】

【八大排序——巅峰决战】目录 前言:---------------排序竞赛---------------一、比赛背景:二、赛前须知:三、比赛进行中……头文件Sort.hStack.h 实现文件Sort.cStack.c 测试文件 四、比赛结果:五、颁奖仪式:--------…

超简单 FishSpeech 本地部署

FishSpeech1.5可以说是目前最受欢迎的语音模型了。由于项目需要,在本地进行搭建,并记录下搭建过程,方便后人。 1. 基本硬件环境 CPU:N年前的 Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz, 32G内存GPU:N年前的 NVIDIA GeForce GTX 1080 Ti,11G显存2. 基本软件环境 操作系统…

手搓四人麻将程序

一、麻将牌的表示 在麻将游戏中,总共有一百四十四张牌,这些牌被分为多个类别,每个类别又包含了不同的牌型。具体来说,麻将牌主要包括序数牌、字牌和花牌三大类。序数牌中,包含有万子、条子和筒子,每种花色…

Python结合ollama和stramlit开发聊天机器人

Python结合ollama和stramlit开发聊天机器人 一、环境准备1、streamlit安装2、langchain安装3、ollama的安装 二、Ollama平台聊天机器人实现1、需求2、模型调用3、前端实现页面呈现代码实现 三、详细代码地址四、参考资源 一、环境准备 1、streamlit安装 # 通过 pip 安装 pip …

EtpBot:安卓自动化脚本开发神器

EtpBot 是什么? EtpBot是一款专为安卓设备设计的自动化脚本开发工具,支持用户通过编写脚本实现自动化操作。该模块提供了丰富的API接口,涵盖点击、滑动、输入、截图等常见操作,帮助开发者快速构建自动化任务。ETPBot支持多设备并行…