TypeScript - typeof 搭配 as const 技巧总结

news/2025/9/20 22:48:12/文章来源:https://www.cnblogs.com/bingquan1/p/19103003

这是一种 TypeScript 的高级类型技巧,用于从值推导出类型,实现类型和值的完美同步。

基本语法

const values = ["A", "B", "C"] as const;
type ValueType = typeof values[number];
// ValueType = "A" | "B" | "C"

三个关键组成部分

1. as const - 常量断言

// 没有 as const: string[]
const names1 = ["Alice", "Bob"];// 有 as const: readonly ["Alice", "Bob"]
const names2 = ["Alice", "Bob"] as const;

2. typeof - 类型查询

// 获取值的类型
const arr = [1, 2, 3] as const;
type ArrType = typeof arr; // readonly [1, 2, 3]

3. [number] - 索引访问类型

const values = ["A", "B", "C"] as const;
type ValueType = typeof values[number]; // "A" | "B" | "C"

优势特点

// 只在这里定义一次
const eventNames = ["CREATE", "UPDATE", "DELETE"] as const;
type EventName = typeof eventNames[number];// 类型自动同步:EventName = "CREATE" | "UPDATE" | "DELETE"  

自动同步

// 添加新值
const statuses = ["PENDING", "SUCCESS", "FAILED", "CANCELED"] as const;
type Status = typeof statuses[number];
// Status 自动变为: "PENDING" | "SUCCESS" | "FAILED" | "CANCELED"

运行时可用

// 可以在运行时使用数组
statuses.forEach(status => {console.log(`处理状态: ${status}`);
});// 验证函数
function isValidStatus(status: string): status is Status {return statuses.includes(status as Status);
}

适用场景

1. 固定值集合

// 颜色主题
const themes = ["light", "dark", "system"] as const;
type Theme = typeof themes[number];// 用户角色
const roles = ["admin", "user", "guest"] as const;
type Role = typeof roles[number];

2. 配置选项

const sortOptions = ["name", "date", "price"] as const;
type SortOption = typeof sortOptions[number];

3. API 端点

const apiEndpoints = ["/users", "/posts", "/comments"] as const;
type ApiEndpoint = typeof apiEndpoints[number];

对比其他方案

方案 类型安全 运行时可用 维护性
typeof values[number]
直接联合类型
枚举 ⚠️

最佳实践

推荐使用

// 定义常量数组
const eventNames = ["API:UN_AUTHORIZED", "API:INVAALID", "API:NETWORK_ERROR", "API:SESSION_EXPIRRED"] as const;
type EventName = typeof eventNames[number];
/*** 监听事件* @param eventNme 事件名称* @param listener */
on(eventName: EventName, listener: Function)  {if(eventNames.includes(eventName)) {// 运行时安全this.listeners[eventName].add(listener);}
}

避免使用

// 不需要运行时验证的简单场景
type SimpleStatus = "active" | "inactive";

常见错误

忘记 as const

const colors = ["red", "blue"]; // string[]
type Color = typeof colors[number]; // string

错误的使用场景

// 不适合动态生成的数据
const dynamicValues = fetchDataFromAPI(); // 运行时数据
type DynamicType = typeof dynamicValues[number]; // 可能不是预期的类型

总结

使用时机:当你需要一组固定的值,并且希望在编译时和运行时都能使用这些值。

核心价值:保持类型定义和实际值的完全同步,避免重复和维护负担。

记住口诀:as const 定值,typeof 取型,[number] 得联合,类型值永同步!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 8.5.2.111部署Zabbix6.0 手把手、保姆级

CentOS 8.5.2.111部署Zabbix6.0 手把手、保姆级CentOS 8.5.2.111部署Zabbix6.0 手把手、保姆级 前提、设置网络Ip地址等 cd /etc/sysconfig cd network-scripts/ ls vim ifcfg-enp0s3 systemctl restart NetworkManage…

[Linux/Docker] BusyBox : 开源、轻量级的Unix工具集

0 序 Docker时代,软件程序的最小化、轻量化部署趋势BusyBox 现在越来越流行,特别是在 Docker 用户中,许多 Docker 镜像使用 BusyBox 为你提供最小镜像。BusyBox := 原 Linux 发行版预装的 GNU Coreutils 在 Docker …

Part03 数据结构 - 教程

Part03 数据结构 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…

图解3:幂等使用场景

幂等,API接口和MQ消费重复

推荐一款数据库安全产品:全知科技知形-数据库风险监测系统的价值解析

推荐一款数据库安全产品:全知科技知形-数据库风险监测系统的价值解析在当下数字经济快速发展的浪潮中,数据已被视为企业最核心的生产要素。无论是金融、医疗,还是互联网与制造业,数据库都是数据存储与流转的“中枢…

变量,常量,作用域

变量JAVA是一种强类型语言,每个都必须声明其类型。JAVA变量是程序中最基本的存储单位,其要素包括变量名,变量类型和作用域。 type varName [=value] [{,varName[=value]}]; //数据类型 变量名 = 值; 可以使用逗号隔…

wireshark 进行snmp 协议加密报文解密查看

转发请注明出处:在环境上进行对数通设备进行 snmp 采集数据,在现网运行环境中运行时,会偶尔出现异常,于是,采用tcpdump抓包,tcpdump 抓包得报文用wireshark打开之后,查询上报设备上报得数据层data格式如下:由于…

linux kernel synchronization 2

Per CPU VariablesA CPU should not access the elements of the array corresponding to other CPU. 每个CPU拥有该变量的独立副本 无需加锁 - 由于每个CPU只操作自己的副本,因此读写自己的副本时不会产生竞争条件 缓…

MySQL高阶查询语句与视图实战指南 - 指南

MySQL高阶查询语句与视图实战指南 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

订单未支付多种方案

1、微服务常用MQ 2、单体情况下常用定时任务

耳鸣针灸学位

耳鸣针灸学位足驷马 中九里 灵骨 叉三 行间 肾关 太溪 牵引针患侧 听宫或者耳门

Twincat 中如何将位变量链接到字节

最近在测试一个EtherCAT IO模块, 参考视频Ethercat总线快速入门教程——1-2TwinCAT基本操作_哔哩哔哩_bilibili 我手里是欧辰的一个模块,它的输入输出都是字节形式的因此小改了下PLC程序 1. 在DUTs中新建了一个结构体…

不管不管,就要你的特殊对待(权限)

特殊权限,文件特殊属性除rwx(读写执行)三种文件权限外,还有哪些权限呢? 一.SUID 1.是什么? “以文件所有者的身份运行程序”。主要作用于可执行文件。 当一个可执行文件设置了 SUID 位时,任何用户在执行该文件时,…

202003_攻防世界_功夫再高也怕菜刀

流量分析,文件分离,WebShellTags:流量分析,文件分离,WebShell 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202003_攻防世界_功夫再高也怕菜刀.zi…

工业软件:重塑协同流程、降低制造成本的关键器具

工业软件:重塑协同流程、降低制造成本的关键器具pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

实用指南:【2025最新版】PCL点云处理算法汇总(C++长期更新版)

实用指南:【2025最新版】PCL点云处理算法汇总(C++长期更新版)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

Gemini Proxy for Xcode 26

总的来说体验一塌糊涂,还不如Cursor/Trae或者是vscode装CLINE/RooCode等插件,更别提用Claude Code(虽然Xcode内置了,但是Claude Code官方明确不给中国大陆使用),需要一些手段来绕过进行使用, Xcode支持open AI 的一些接…