讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

updream

一键生成高质量推广成片

AniShort
AniShort

AI短剧协同制作平台

Laper
Laper

剧本策划到成片协作

TypeScript类型与运行时值:深入理解与实践

阿静大大_3818

阿静大大_3818

发布时间:2025-10-04 14:08:13

|

221人浏览过

|

来源于php中文网

原创

typescript类型与运行时值:深入理解与实践

本文旨在阐明TypeScript类型在编译时进行类型检查并在运行时被擦除的本质。我们将探讨为何不能直接在运行时访问声明的TypeScript类型,并提供两种实用的JavaScript方法——使用const变量或对象属性——来在运行时表示和获取字面量值,以实现类型安全与运行时数据访问的平衡。

TypeScript类型与运行时行为的本质

TypeScript的核心目标是为JavaScript提供静态类型检查能力。它在开发阶段提供强大的类型安全保障,帮助开发者在代码运行前发现潜在错误,提升代码质量和可维护性。

然而,理解TypeScript的一个关键点在于其“类型擦除”(Type Erasure)机制。这意味着,当TypeScript代码被编译成纯JavaScript时,所有的类型注解、接口、类型别名(如type CardType = 'InformationCard')等类型信息都会被完全移除,不会留下任何运行时痕迹。编译后的JavaScript代码将不包含任何TypeScript特有的类型构造。

因此,尝试像console.log(CardType)这样直接访问一个声明的TypeScript类型,是无法成功的。在编译后的JavaScript代码中,CardType这个标识符将不复存在,它仅仅是一个编译时概念,自然也就无法在运行时获取其“值”。

示例代码:

type CardType = 'InformationCard';

// 以下代码在TypeScript编译时会报错,因为CardType是一个类型,而非运行时可访问的值
// console.log(CardType); 
// 错误信息示例: 'CardType' refers to a type, but is used as a value here.

上述代码清晰地表明,TypeScript编译器会阻止这种尝试,因为它识别到CardType是一个类型定义,而不是一个可以在运行时被求值的变量。

如何在运行时表示和使用字面量值

既然TypeScript类型不能在运行时直接访问,那么如何才能在运行时获取到像'InformationCard'这样的字面量字符串呢?解决方案是利用JavaScript原生的变量或对象来存储这些值。这样,我们既能利用TypeScript进行类型检查,又能确保所需的值在运行时可用。

javascript-typescript-typescript-scaffold
javascript-typescript-typescript-scaffold

你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

下载

方法一:使用const声明字面量变量

最直接且推荐的方法是使用const关键字声明一个常量,将其值设置为所需的字面量。这样,这个常量在运行时就是可访问的。同时,我们可以利用TypeScript的类型系统来约束这个常量,确保其值符合预期的字面量集合。

示例代码:

// 声明一个TypeScript类型,用于编译时类型检查,定义了允许的字面量集合
type CardTypeName = 'InformationCard' | 'ProductCard' | 'ServiceCard';

// 声明一个运行时常量,其值与类型中的某个字面量匹配
const INFORMATION_CARD_VALUE: CardTypeName = 'InformationCard';
const PRODUCT_CARD_VALUE: CardTypeName = 'ProductCard';

console.log(INFORMATION_CARD_VALUE); // 输出: InformationCard
console.log(PRODUCT_CARD_VALUE);    // 输出: ProductCard

// 尝试给常量赋一个不在CardTypeName中的值,TypeScript会报错
// const INVALID_CARD_VALUE: CardTypeName = 'UnknownCard'; // Error: Type '"UnknownCard"' is not assignable to type 'CardTypeName'.

说明: 这里的INFORMATION_CARD_VALUE和PRODUCT_CARD_VALUE是标准的JavaScript常量。它们在TypeScript编译后依然存在于JavaScript代码中,因此可以在运行时被访问和使用。通过CardTypeName类型,我们仍然能够在开发阶段获得类型安全,确保这些常量的值是预期的字面量。

方法二:使用对象属性存储字面量值

当需要将字面量值与特定的数据结构或实例关联起来时,可以使用对象属性来存储。这种方法在处理数据模型或配置对象时非常常见。

示例代码:

// 定义一个接口或类型,确保对象的结构和属性类型
interface CardData {
    cardType: 'InformationCard' | 'ProductCard';
    title: string;
    content: string;
}

// 创建一个对象实例,其属性值在运行时可访问
const myCard: CardData = {
    cardType: "InformationCard",
    title: "欢迎信息",
    content: "这是一张信息卡片的详细内容。"
};

const anotherCard: CardData = {
    cardType: "ProductCard",
    title: "产品展示",
    content: "查看我们的最新产品!"
};

console.log(myCard.cardType);      // 输出: InformationCard
console.log(anotherCard.cardType); // 输出: ProductCard

// 可以在运行时根据 cardType 属性进行逻辑判断
if (myCard.cardType === 'InformationCard') {
    console.log("处理信息卡片逻辑...");
}

说明: 这种方法允许我们将字面量值作为对象的一部分进行管理和访问。myCard.cardType在运行时是一个普通的字符串,可以被自由地读取、比较和用于各种业务逻辑。通过CardData接口,TypeScript在编译时确保了cardType属性的值始终是预定义字面量中的一个。

总结与注意事项

  • 核心原则: TypeScript类型是编译时构造,用于提供静态类型检查和开发时的智能提示,它们在运行时会被完全擦除。JavaScript运行时只处理值。
  • 区分用途: 在编写TypeScript代码时,应明确区分“类型定义”和“值声明”的目的。类型定义用于增强代码的健壮性和可维护性,提供更好的开发体验;而值声明则用于在程序运行时存储和操作数据。
  • 设计考量: 当你需要一个在编译时提供类型检查,同时又能在运行时被访问的特定字符串或数字字面量时,请使用const变量或将其作为对象属性来存储。这两种方法都能有效地桥接类型安全和运行时数据访问的需求。
  • 理解这一基本原理对于有效地利用TypeScript的强大功能,同时避免常见的误解至关重要。它能帮助开发者在设计系统时,清晰地规划哪些是纯粹的类型信息,哪些是需要在运行时存在的实际数据。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SoundView
SoundView Hot

SoundView是一款面向跨境电商的视频翻译、配音和本地化 AI 创作平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

332

2026.02.13

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

540

2026.02.25

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

411

2026.03.13

TypeScript 全栈开发进阶指南
TypeScript 全栈开发进阶指南

面向有 JavaScript 基础的开发者,深入讲解 TypeScript 的类型系统与全栈开发实践。

326

2026.06.03

TypeScript Node.js 全栈工程化与Monorepo架构实践
TypeScript Node.js 全栈工程化与Monorepo架构实践

本专题围绕 TypeScript 在 Node.js 全栈开发中的工程化实践展开,系统讲解 Monorepo 架构设计、包管理策略、模块复用机制以及服务端与前端统一类型系统的构建方法。通过真实项目案例,帮助开发者提升大型全栈项目的可维护性与协作效率。

758

2026.06.16

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

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

6384

2023.10.24

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

18060

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1263

2024.02.23

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn