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

类型与变量

类型声明空间

类型声明就是告诉 TypeScript"这个东西是什么类型"的语句。它就像是给变量、函数、对象等贴上的类型标签,让 TypeScript 编译器知道该如何理解和检查你的代码。

类型声明空间存储类型别名、接口、类(类型部分)interface User {}type ID = string
// 这些声明都进入类型声明空间 interface User { name: string; } // ✅ 进入类型空间 type ID = string | number; // ✅ 进入类型空间 class Animal { name: string; } // ✅ 同时进入类型空间(作为类型) enum Color { Red, Green } // ✅ 同时进入类型空间(作为类型) // 这些不进入类型声明空间 const x = 10; // ❌ 只进入变量空间 function foo() {} // ❌ 只进入变量空间

type 可以用来定义别名,纯类型空间居民

type ID = string | number; ID只能是string类型或者number类型
type Status = "pending" | "success" | "error"; 创建了一个叫 Status 的"类型",这个类型的值只能是 "pending"、"success" 或 "error" 这三个字符串中的一个。

变量声明空间

变量声明空间存储变量、函数、类(值部分)const x = 1function foo() {}

Class的双重身份(双空间)

"双空间公民"意思是:一个class声明同时做了两件事

  1. 创建了一个类型(在类型声明空间)- 用于类型检查

  2. 创建了一个构造函数(在变量声明空间)- 用于创建对象

​ // ✅ 类同时存在于两个空间 class Person { name: string; constructor(name: string) { this.name = name; } } // 作为类型使用(类型声明空间) let p: Person; // 类型注解 // 作为值使用(变量声明空间) const p2 = new Person("Alice"); // 创建实例 // ❌ interface 只存在于类型空间 interface Animal { species: string; } // 错误!不能用作值 // const a = new Animal(); // ❌ 'Animal' 仅表示类型 ​
// ✅ Person 作为"类型"使用 let person1: Person; // 声明变量类型 // 作为变量使用 let person1 = Person // 变量代表Person的构造函数, console.log(typeof p) // function

同名声明(互相独立的两个空间)

// 同名标识符可以在两个空间中独立存在 type State = string; // 类型空间 const State = "pending"; // 变量空间(不冲突) // 类的双重作用 class User { static type = "admin"; // 类静态属性(变量空间) name: string; // 实例属性(类型空间的一部分) } // 类型别名与变量同名 type ID = number; const ID = 123; // ✅ 可以共存

类型注解

类型注解是显式告诉 TypeScript 变量、参数、返回值等应该是什么类型的语法。

// 基本语法 let variable: type = value;
// 示例 let age: number = 25; let name: string = "Alice"; let isActive: boolean = true; let items: string[] = ["a", "b"]; // 函数参数和返回值 function greet(name: string): string { return `Hello, ${name}`; } // 箭头函数 const add = (a: number, b: number): number => a + b;

类型推断

TypeScript 能够在没有显式类型注解的情况下,根据上下文自动推断出变量的类型。

// 基础推断 let x = 3; // 推断为 number let y = "hello"; // 推断为 string let z = [1, 2, 3]; // 推断为 number[] // 函数返回值推断 function sum(a: number, b: number) { return a + b; // 推断返回类型为 number } // 上下文类型推断 window.onmousedown = function(e) { // e 被推断为 MouseEvent 类型 console.log(e.button); };

类型注解 vs 类型断言

// 类型注解:编译时检查,限制赋值 let a: string | number = "hello"; a = 42; // ✅ 可以 // a = true; // ❌ 类型不匹配 // 类型断言:告诉编译器"相信我,我知道类型" const el = document.getElementById("app") as HTMLDivElement; const value = "123" as unknown as number; // 双重断言 // 断言语法 const val1 = someValue as string; const val2 = <string>someValue; // JSX 中不推荐
http://www.jsqmd.com/news/1125726/

相关文章:

  • 一张产品图丢给 GPT,详情页直接出来了!
  • GDB调试简介与调试配置 _
  • 用 Codex 创建论文全文下载 Skill
  • 2026年AI论文软件测评:5款神器从大纲到答辩全链路通关攻略
  • 巧用API聚合市场:B站用户动态API高效接入实战
  • 私有化部署Dify:四步在Windows本地搭建开源AI应用开发平台
  • 多层金属的“异质变形“为什么是矫平工艺的终极难题?
  • 167、PCIE硬件设计概述:PCB与连接器
  • trae接如claudecode
  • 打通运维知识壁垒:以 CentOS7 与数据库为核心,搭建系统 - 网络 - 数据一体化运维体系
  • RAG 工程化实践:如何避免半成品文档进入在线召回
  • 用运筹学与强化学习构建个人发展量化分析模型
  • 杭州萧然医院环境怎么样
  • yolov26改进 | 融合改进篇 | 利用尺度统一检测头DynamicHead融合P2增加小目标检测层(让小目标无所遁形)
  • Boss-Key终极指南:3秒实现Windows窗口隐身术,保护你的数字隐私空间
  • 基于13DOF传感器的高精度定位导航系统设计与实现
  • 图像和视频处理的核心概念(在图像上画直线)
  • C++协程用法总结
  • 如何在5分钟内免费下载网络视频:VideoDownloadHelper终极指南
  • AI工具推荐 第一期:WorkBuddy对标codex,适合职场人的AI工具
  • 2026年6月最新安徽大健康行业GEO优化机构盘点:服务趋势观察
  • 【Qwt 7.0 系列】多坐标轴与多绘图布局 —— 寄生绘图与 QwtFigure 容器
  • 入门级降噪耳机怎么选:从通勤、会议和续航看 5 款值得关注的产品
  • 嵌入式八股文 第一期
  • Perplexity vs 秘塔AI vs Google SGE:三大AI搜索引擎横评
  • 四类芯片对比(一)
  • UNY Finance生态航母再扩容,UNY Bet(UNY预测)即将上线!
  • 通产美伦MB8010能量平台运维质控实操方案分享
  • 【极简监控·番外篇】被逼无奈的“降维打击”:Java Remote Debug 救火指南
  • MongoDB 大数据备份,新手教程