网站首页 > 技术文章 正文
基于最新版本(2025年整理,从环境搭建到类型系统详解)
一、TypeScript简介:为什么需要它?
1.1 JavaScript的痛点与TS的解决方案
JavaScript 是一种动态类型语言,开发时灵活但维护困难:
// JavaScript代码示例
function add(a, b) {
return a + b;
}
add(10, "20"); // 输出 "1020",但不会报错!
TypeScript 的核心价值:
- 静态类型检查:在代码运行前(编译时)发现类型错误
- 代码智能提示:IDE 能根据类型推导出属性和方法
- 面向对象增强:支持接口、泛型等高级特性
1.2 TS与JS的关系:超集的本质
- TS是JS的超集:所有合法的JS代码都是合法的TS代码
- 需要编译:TS代码需通过tsc编译器转换为JS(浏览器只认识JS)
- 渐进式采用:可在JS项目中逐步引入TS文件
二、开发环境搭建(2025最新版)
2.1 安装Node.js与TypeScript
- 访问 Node.js官网 安装最新LTS版本
- 验证安装(命令行执行):
node -v # 输出 v20.12.1(示例版本)
npm -v # 输出 10.5.0
- 全局安装TypeScript编译器:
npm install -g typescript
tsc --version # 输出 Version 5.4.5(示例版本)
2.2 配置VSCode(推荐IDE)
- 必装插件:
TypeScript IntelliSense(内置,无需额外安装)
ESLint(代码规范检查)
Prettier(代码自动格式化) - 实时编译TS文件:
创建hello.ts文件,输入 console.log("Hello TS")
终端执行:tsc hello.ts → 生成hello.js - 自动化编译:
项目根目录执行:tsc --init 生成tsconfig.json
修改配置:
{
"compilerOptions": {
"target": "ES2025", // 编译目标ES版本
"strict": true, // 开启严格模式
"outDir": "./dist" // 输出目录
}
}
执行 tsc -w 监听文件变化并自动编译
三、基础类型系统(附代码示例)
3.1 原始类型:明确定义变量用途
// 显式类型注解
let age: number = 25;
let name: string = "Alice";
let isStudent: boolean = true;
let nothing: null = null;
let notDefined: undefined = undefined;
// 类型错误示例
age = "30"; // 报错:不能将类型“string”分配给类型“number”
3.2 数组与元组:结构化数据
// 数组两种写法等价
let numbers: number[] = [1, 2, 3];
let fruits: Array<string> = ["apple", "banana"];
// 元组:固定长度和类型
let person: [string, number] = ["Alice", 30];
person[0] = "Bob"; //
person[1] = "25"; // 类型“string”不能赋值给“number”
person.push("extra"); // 严格模式下元组长度固定,push会报错
3.3 枚举:给常量命名
// 数字枚举(默认从0开始)
enum Direction {
Up, // 0
Down, // 1
Left, // 2
Right // 3
}
let dir: Direction = Direction.Up;
// 字符串枚举(更易调试)
enum LogLevel {
Info = "INFO",
Error = "ERROR"
}
console.log(LogLevel.Error); // 输出 "ERROR"
3.4 特殊类型:any vs unknown
// any:关闭类型检查(慎用!)
let data: any = "hello";
data = 100; //
data.toFixed(); // 编译通过,但运行时可能报错!
// unknown:安全版的any
let userInput: unknown = fetchUserInput();
userInput.toUpperCase(); // 直接操作会报错
if (typeof userInput === "string") {
userInput.toUpperCase(); // 类型守卫后可用
}
3.5 void与never:函数的特殊返回
// void:无返回值(默认可省略)
function logMessage(msg: string): void {
console.log(msg);
}
// never:永远不会返回(常用于抛出错误)
function throwError(message: string): never {
throw new Error(message);
}
四、类型推论与联合类型
4.1 自动类型推断
let score = 95; // 自动推断为number类型
score = "100"; // 错误:类型不匹配
let mixedArr = [1, "two"]; // 推断为 (number | string)[]
4.2 联合类型与类型守卫
// 联合类型:变量可以是多种类型之一
let id: string | number;
id = "ABC123"; //
id = 123; //
// 类型守卫:运行时检查类型
function printId(id: string | number) {
if (typeof id === "string") {
console.log(id.toUpperCase());
} else {
console.log(id.toFixed(2));
}
}
五、新手常见问题QA
Q1:TS一定要用类吗?
答:不需要!TS的核心是类型系统,即使不用类也能享受类型检查。
Q2:TS编译后的代码和我的源码不一致?
答:tsc默认编译为ES3代码,通过修改tsconfig.json中的target可调整目标版本。
Q3:为什么我的VSCode没有智能提示?
答:检查是否安装了TypeScript插件,或尝试重启VSCode。
下一篇预告(中篇):
- 函数类型与重载
- 接口(Interface)与类型别名(type)的深度对比
- 对象类型的进阶操作
立即练习建议:
- 在本地创建一个playground.ts文件,尝试所有示例
- 故意写一些类型错误的代码,观察编译器的报错信息
(中篇将在24小时内更新,建议先掌握本篇内容并动手实践!)
- 上一篇: 原 顶 ECMAScript6入门 学习之简介
- 下一篇: 如何判断一颗树是二叉搜索树
猜你喜欢
- 2025-05-24 ROS2 Jazzy:用C++实现一个动作服务器和客户端
- 2025-05-24 高性能Gin框架原理学习教程
- 2025-05-24 Python 3.8异步并发编程指南
- 2025-05-24 聊聊redisson的RLock的unlock
- 2025-05-24 Linux分区页框分配器之水位
- 2025-05-24 记一次集群内无可用http服务问题排查
- 2025-05-24 案例 | 某电商如何构建Zabbix高可用监控平台?
- 2025-05-24 Fluent 重叠网格和动态网格 教程
- 2025-05-24 性能测试工具Locust
- 2025-05-24 iLogtail 使用入门 - K8S 环境日志采集到 SLS
- 05-24高中数学解题分析方法及知识点
- 05-24C/C++编程笔记:无法在C++中重载的函数,六种方式
- 05-24面试与实战:什么是 Lambda?该如何使用?
- 05-24设计模式之单件模式
- 05-24Axon Framework - 模型- 聚合
- 05-24自动化利器Python类实例方法、静态方法和类方法的区别和用法
- 05-24嵌入式开发必看!面向过程VS面向对象,哪种更适合你的项目?
- 05-24Python:深度剖析实例方法、类方法和静态方法的区别
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)