0

0

理解 TypeScript 类型与运行时值的边界:如何获取声明类型的字面量值

DDD

DDD

发布时间:2025-10-04 16:26:23

|

271人浏览过

|

来源于php中文网

原创

理解 TypeScript 类型与运行时值的边界:如何获取声明类型的字面量值

TypeScript 的类型系统主要用于编译时静态检查,提升代码安全性,但类型本身在运行时并不可用。本文将解释 TypeScript 类型与 JavaScript 运行时值的根本区别,并提供通过常量、对象属性或枚举等运行时构造来存储和访问与类型对应的字面量值的实践方法,帮助开发者正确处理类型与值的关系。

TypeScript 类型与运行时值的根本区别

typescript 是一种 javascript 的超集,它引入了静态类型系统,旨在提高代码的可维护性和健壮性。然而,理解 typescript 的一个核心概念是:类型仅在编译时存在,而在运行时会被擦除(type erasure)。这意味着,当你编写 typescript 代码并将其编译成 javascript 时,所有的类型信息都会被移除。最终在浏览器node.js 环境中执行的,是纯粹的 javascript 代码,其中不包含任何 typescript 的类型声明。

例如,当你声明一个类型别名:

type CardType = 'InformationCard';

这个 CardType 仅仅是一个编译时构造,用于在开发阶段对变量进行类型检查。它不会被编译成任何 JavaScript 变量或对象。

为什么不能直接访问声明的类型

基于上述类型擦除的原理,尝试直接在运行时访问或打印一个 TypeScript 类型别名是不可行的。例如,以下代码在 TypeScript 中会引发编译错误,或在编译成 JavaScript 后因 CardType 未定义而导致运行时错误:

type CardType = 'InformationCard';

// 尝试直接访问类型别名,这是不正确的用法
// console.log(CardType); // 编译时会报错:'CardType' refers to a type, but is used as a value here.

错误信息明确指出 CardType 是一个类型,而不是一个值。JavaScript 运行时只识别值(如字符串、数字、对象、函数等),而不识别 TypeScript 的类型声明。

获取与类型对应的运行时值的方法

尽管类型本身不能在运行时直接访问,但我们可以通过 JavaScript 的运行时构造来存储和使用与类型对应的字面量值。以下是几种常用的方法:

方法一:使用常量存储字面量值

最直接的方法是声明一个 const 变量来存储与你类型定义中字面量相同的值。这样,你既可以利用 TypeScript 的类型检查,又能在运行时访问该值。

// 1. 定义一个类型别名,用于编译时类型检查
type CardTypeAlias = 'InformationCard';

// 2. 声明一个常量,其值与类型别名中的字面量一致
// 我们可以为这个常量显式指定类型,以确保类型安全
const cardTypeNameValue: CardTypeAlias = 'InformationCard';

// 3. 在运行时访问并使用这个常量
console.log(cardTypeNameValue); // 输出: InformationCard

// 或者,如果你只是需要一个字面量值,可以直接声明一个常量
const directCardTypeName = 'InformationCard';
console.log(directCardTypeName); // 输出: InformationCard

这种方法简单明了,适用于需要将单个字面量值与特定类型关联的场景。

Cutout.Pro抠图
Cutout.Pro抠图

AI批量抠图去背景

下载

方法二:通过对象属性封装值

当字面量值是某个对象的一部分时,将其作为对象的属性存储是常见的做法。TypeScript 接口(interface)或类型别名可以很好地定义这些对象的结构。

// 1. 定义一个联合类型,表示可能的卡片类型字面量
type CardTypeLiteral = 'InformationCard' | 'ProductCard' | 'ServiceCard';

// 2. 定义一个接口或类型,描述包含卡片类型属性的对象
interface Card {
  type: CardTypeLiteral; // 这里的 type 属性会受到 CardTypeLiteral 的类型检查
  id: string;
  // 其他属性...
}

// 3. 创建一个符合接口定义的运行时对象
const myCard: Card = {
  type: 'InformationCard', // 'InformationCard' 是一个运行时值
  id: 'card-123',
};

// 4. 在运行时访问对象的属性值
console.log(myCard.type); // 输出: InformationCard

这种方法非常适合在数据结构中存储和管理类型相关的字面量值。

方法三:利用 TypeScript 枚举(Enum)

TypeScript 的枚举(enum)提供了一种同时定义一组命名常量和对应运行时值的方式。枚举成员既是类型,也是运行时可用的值。

// 1. 定义一个字符串枚举
enum CardTypesEnum {
  InformationCard = 'InformationCard',
  ProductCard = 'ProductCard',
  ServiceCard = 'ServiceCard',
}

// 2. 枚举成员既可以作为类型使用,也可以作为运行时值使用
const currentCardType: CardTypesEnum = CardTypesEnum.InformationCard;

// 3. 在运行时访问枚举成员的值
console.log(currentCardType); // 输出: InformationCard
console.log(CardTypesEnum.ProductCard); // 输出: ProductCard

// 4. 枚举也可以用于类型检查
function processCard(type: CardTypesEnum) {
  if (type === CardTypesEnum.InformationCard) {
    console.log('Processing an Information Card.');
  }
  // ...
}

processCard(CardTypesEnum.ServiceCard); // 输出: (无特定输出,但类型检查通过)

枚举是处理一组相关命名常量时的强大工具,它在编译时提供类型安全,同时在运行时提供可访问的值。

注意事项与最佳实践

  1. 区分编译时与运行时:始终牢记 TypeScript 类型是编译时概念,而 JavaScript 变量和对象是运行时概念。这是理解和正确使用 TypeScript 的基础。
  2. 保持一致性:当你通过常量或对象属性来模拟类型字面量时,确保这些运行时值与你的类型定义保持一致。例如,使用 as const 断言可以帮助 TypeScript 推断出更窄的字面量类型,从而提高类型安全性。
  3. 选择合适的构造
    • 如果只需要一个单一的字面量值,使用 const 变量是最简单的。
    • 如果值是复杂数据结构的一部分,将其作为对象属性是标准做法。
    • 如果有一组相关的、需要命名的常量,并且希望它们同时具备类型和值的功能,那么枚举是理想选择。

总结

TypeScript 的类型系统旨在提供强大的静态分析能力,以在开发阶段捕获错误并增强代码可读性。然而,它不会改变 JavaScript 在运行时的工作方式。要获取和使用与 TypeScript 声明类型对应的字面量值,我们必须依赖 JavaScript 的运行时构造,如 const 变量、对象属性或 enum 枚举。理解这一核心区别,并选择适当的运行时策略,是有效利用 TypeScript 进行开发的关键。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1503

2023.10.24

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

531

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1503

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

625

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

655

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

610

2024.04.29

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号