TypeScript 全面学习指南 (2025最新版)
TypeScript 全面学习指南
目录
- TypeScript 简介
- 环境搭建与工具
- 基础类型
- 变量声明
- 接口(Interfaces)
- 类(Classes)
- 函数(Functions)
- 泛型(Generics)
- 枚举(Enums)
- 类型推论与类型断言
- 高级类型
- 模块(Modules)
- 命名空间(Namespaces)
- 装饰器(Decorators)
- Mixins
- 声明文件(.d.ts)与使用第三方库
- tsconfig.json 配置详解
- 编译与构建
- 调试
- 与JavaScript互操作
- 最佳实践
- 常见问题与解决方案
- 学习资源
1. TypeScript 简介
TypeScript 是 JavaScript 的超集,由微软开发并开源。它添加了静态类型系统和其他特性,使得开发大型应用更加容易。TypeScript 最终编译为纯 JavaScript。
主要特性:
- 静态类型检查
- 类、接口等面向对象特性
- 编译时类型检查
- 支持最新的ECMAScript特性
- 可选的类型系统
2. 环境搭建与工具
安装
npm install -g typescript
编辑器推荐
- Visual Studio Code(内置TS支持)
3. 基础类型
TypeScript 支持 JavaScript 的所有基础类型,并增加了额外的类型:
boolean
: 布尔值number
: 数字(包括二进制、八进制、十进制、十六进制)string
: 字符串array
: 数组(两种写法:number[]
或Array<number>
)tuple
: 元组,例如[string, number]
enum
: 枚举any
: 任意类型(避免使用)void
: 通常用于函数没有返回值null
和undefined
: 所有类型的子类型never
: 表示永远不会出现的值,如抛出异常的函数object
: 非原始类型(非number
,string
,boolean
,symbol
,null
, 或undefined
)
示例:
let isDone: boolean = false;
let decimal: number = 6;
let color: string = "blue";
let list: number[] = [1, 2, 3];
let tuple: [string, number] = ["hello", 10]; // 元组
enum Color {Red, Green, Blue} // 枚举
let notSure: any = 4;
function warnUser(): void { console.log("This is a warning"); }
let u: undefined = undefined;
let n: null = null;
4. 变量声明
与 JavaScript 类似,使用 let
和 const
。推荐使用 const
声明常量,let
声明变量。
5. 接口(Interfaces)
接口定义对象的形状(属性、方法等)。
interface Person {name: string;age: number;readonly id: number; // 只读属性nickname?: string; // 可选属性greet(phrase: string): void;
}// 实现接口
const john: Person = {name: "John",age: 30,id: 1234,greet(phrase: string) {console.log(`${phrase} ${this.name}`);}
};// 函数类型接口
interface SearchFunc {(source: string, subString: string): boolean;
}// 可索引类型接口(数组和对象)
interface StringArray {[index: number]: string;
}
6. 类(Classes)
TypeScript 支持基于类的面向对象编程。
class Animal {// 成员变量(默认public)private name: string; // 私有变量,只能在类内部访问protected age: number; // 受保护变量,可在子类访问// 构造函数constructor(name: string, age: number) {this.name = name;this.age = age;}// 方法move(distance: number = 0) {console.log(`${this.name} moved ${distance}m`);}
}// 继承
class Dog extends Animal {bark() {console.log('Woof! Woof!');// console.log(this.name); // 错误,name是privateconsole.log(this.age); // 正确,age是protected}
}// 抽象类
abstract class Department {abstract printMeeting(): void; // 抽象方法
}
7. 函数(Functions)
函数类型包含参数类型和返回值类型。
// 函数声明
function add(x: number, y: number): number {return x + y;
}// 函数表达式
const myAdd: (x: number, y: number) => number = function(x: number, y: number): number {return x + y;
};// 可选参数(必须放在最后)
function buildName(firstName: string, lastName?: string) {return firstName + (lastName ? ` ${lastName}` : '');
}// 默认参数
function buildName2(firstName: string, lastName = "Smith") { ... }// 剩余参数
function buildName3(firstName: string, ...restOfName: string[]) { ... }// 函数重载
function makeDate(timestamp: number): Date;
function makeDate(m: number, d: number, y: number): Date;
function makeDate(mOrTimestamp: number, d?: number, y?: number): Date {if (d !== undefined && y !== undefined) {return new Date(y, mOrTimestamp, d);} else {return new Date(mOrTimestamp);}
}
8. 泛型(Generics)
泛型用于复用代码,同时保持类型安全。
// 泛型函数
function identity<T>(arg: T): T {return arg;
}// 泛型接口
interface GenericIdentityFn<T> {(arg: T): T;
}// 泛型类
class GenericNumber<T> {zeroValue: T;add: (x: T, y: T) => T;
}// 泛型约束
interface Lengthwise {length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {console.log(arg.length);return arg;
}
9. 枚举(Enums)
枚举类型用于定义一组命名常量。
// 数字枚举(默认从0开始)
enum Direction {Up, // 0Down, // 1Left, // 2Right // 3
}// 字符串枚举
enum DirectionStr {Up = "UP",Down = "DOWN",Left = "LEFT",Right = "RIGHT"
}// 异构枚举(混合字符串和数字,不推荐)
enum BooleanLikeHeterogeneousEnum {No = 0,Yes = "YES",
}
10. 类型推论与类型断言
类型推论:TypeScript 会在没有明确指定类型的时候推测出一个类型。 类型断言:告诉编译器“我知道这个变量的类型”。
// 类型推论
let x = 3; // x 被推断为 number// 类型断言(两种形式)
let someValue: any = "this is a string";
let strLength1: number = (<string>someValue).length;
let strLength2: number = (someValue as string).length; // 推荐在JSX中使用
11. 高级类型
交叉类型(Intersection Types)
function extend<T, U>(first: T, second: U): T & U {return { ...first, ...second };
}
联合类型(Union Types)
function padLeft(value: string, padding: string | number) { ... }
类型别名(Type Aliases)
type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
字符串字面量类型
type Easing = "ease-in" | "ease-out" | "ease-in-out";
可辨识联合(Discriminated Unions)
interface Square {kind: "square";size: number;
}
interface Rectangle {kind: "rectangle";width: number;height: number;
}
type Shape = Square | Rectangle;
索引类型(Index Types)
function pluck<T, K extends keyof T>(obj: T, keys: K[]): T[K][] {return keys.map(key => obj[key]);
}
映射类型(Mapped Types)
type Readonly<T> = {readonly [P in keyof T]: T[P];
};
type Partial<T> = {[P in keyof T]?: T[P];
};
条件类型(Conditional Types)
type TypeName<T> =T extends string ? "string" :T extends number ? "number" :"object";
12. 模块(Modules)
TypeScript 支持 ES6 模块语法。
// 导出
export interface Person { ... }
export class Employee { ... }
export default function() { ... }// 导入
import { Person } from "./module";
import Employee from "./module"; // 默认导入
import * as Module from "./module";
13. 命名空间(Namespaces)
命名空间用于组织代码,以避免全局作用域污染。但在 ES6 模块化后,推荐使用模块。
namespace Validation {export interface StringValidator {isAcceptable(s: string): boolean;}
}
14. 装饰器(Decorators)
装饰器是一种特殊类型的声明,用于附加到类、方法、属性或参数上。需要启用 experimentalDecorators
选项。
// 类装饰器
function sealed(constructor: Function) {Object.seal(constructor);Object.seal(constructor.prototype);
}@sealed
class Greeter {greeting: string;constructor(message: string) {this.greeting = message;}
}// 方法装饰器
function enumerable(value: boolean) {return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {descriptor.enumerable = value;};
}class Greeter2 {@enumerable(false)greet() { ... }
}
15. Mixins
Mixins 是一种实现多重继承的方式。
class Disposable {isDisposed: boolean = false;dispose() { this.isDisposed = true; }
}class Activatable {isActive: boolean = false;activate() { this.isActive = true; }
}class SmartObject implements Disposable, Activatable {// DisposableisDisposed: boolean = false;dispose!: () => void;// ActivatableisActive: boolean = false;activate!: () => void;
}applyMixins(SmartObject, [Disposable, Activatable]);// 混入函数
function applyMixins(derivedCtor: any, baseCtors: any[]) {baseCtors.forEach(baseCtor => {Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {derivedCtor.prototype[name] = baseCtor.prototype[name];});});
}
16. 声明文件(.d.ts)与使用第三方库
声明文件(Declaration Files)用于描述已有 JavaScript 库的类型信息。
安装 DefinitelyTyped 的类型声明:
npm install --save-dev @types/node
npm install --save-dev @types/lodash
自己编写声明文件:
// myLib.d.ts
declare module "myLib" {export function makeGreeting(s: string): string;export let numberOfGreetings: number;
}
17. tsconfig.json 配置详解
{"compilerOptions": {"target": "es5", // 编译目标ES版本"module": "commonjs", // 模块系统"strict": true, // 启用所有严格类型检查"noImplicitAny": true, // 禁止隐式any"strictNullChecks": true, // 严格空值检查"esModuleInterop": true, // 支持CommonJS和ES模块互操作"outDir": "dist", // 输出目录"declaration": true // 生成声明文件},"include": ["src/**/*.ts"], // 包含的文件"exclude": ["node_modules"] // 排除的文件
}
18. 编译与构建
tsc # 编译所有项目文件
tsc --watch # 监视模式
tsc --project tsconfig.json # 指定配置文件
19. 调试
在 VS Code 中,配置 launch.json
:
{"version": "0.2.0","configurations": [{"type": "node","request": "launch","name": "Launch Program","skipFiles": ["<node_internals>/**"],"program": "${workspaceFolder}/dist/index.js","preLaunchTask": "tsc: build - tsconfig.json","outFiles": ["${workspaceFolder}/dist/**/*.js"]}]
}
20. 与JavaScript互操作
TypeScript 可以直接引入 JavaScript 文件,但需要类型声明(通过声明文件)。
21. 最佳实践
- 尽量使用
interface
而非type
定义对象类型(接口可扩展) - 开启严格模式(
strict: true
) - 避免使用
any
,优先使用更精确的类型 - 使用泛型提高代码复用性
- 使用模块而非命名空间
22. 常见问题与解决方案
-
错误:Element implicitly has an 'any' type
原因:没有为变量指定类型,且无法推断。
解决:显式声明类型或启用noImplicitAny: false
(不推荐)。 -
错误:Cannot find module 'xxx'
解决:安装对应的类型声明文件(@types/xxx
)或自己编写声明文件。 -
错误:Property 'xxx' does not exist on type 'yyy'
解决:检查类型声明,可能需要扩展接口。
23. 学习资源
- TypeScript 官方文档
- TypeScript Deep Dive
- TypeScript Playground
- Type Challenges
相关文章:
TypeScript 全面学习指南 (2025最新版)
TypeScript 全面学习指南 目录 TypeScript 简介环境搭建与工具基础类型变量声明接口(Interfaces)类(Classes)函数(Functions)泛型(Generics)枚举(Enums)类型…...
【redis】过期策略 懒惰删除
过期删除: redis会将所有设置过期时间的key以及过期时间存储在字典里。 redis采取两个策略实现删除过期key: 1、定时删除:定期扫描字典,采用贪心的策略,从字典随机抽20个key,删除其中已经过期的key&#x…...
Docker或Docker-Compose时间时区配置
Docker或Docker-Compose配置时区,主要是为了使用容器内的时间和物理机操作系统的时间保持一致。以下是集中配置Docker或Docker-Compose环境时间时区的方式。 Dockerfile(Docker)中配置时区 在Dockerfile中,可以通过如下方式添加…...
如何在IDE中通过Spark操作Hive
在IDE中通过Spark操作Hive是一项常见的任务,特别是在大数据处理和分析的场景中。本文将详细介绍如何在集成开发环境(IDE)中使用Apache Spark与Hive进行交互,包括必要的设置、代码示例以及详细解释。 环境准备 在开始之前&#x…...

ToolsSet之:XML工具
ToolsSet是微软商店中的一款包含数十种实用工具数百种细分功能的工具集合应用,应用基本功能介绍可以查看以下文章: Windows应用ToolsSet介绍https://blog.csdn.net/BinField/article/details/145898264 ToolsSet中Text菜单下的XML Tool工具是一个Xml工…...

keepalived定制日志bug
keepalived定制日志bug 源码安装apt安装endl 源码安装 在/etc/rsyslog.d/目录下创建 keepalived的日志配置文件keepalived.conf [rootubuntu24-13:~]# vim /etc/rsyslog.d/keepalived.conf [rootubuntu24-13:~]# cat /etc/rsyslog.d/keepalived.conf local6.* /var/log/keepa…...
ElasticSearch+Gin+Gorm简单示例
更多个人笔记见: (注意点击“继续”,而不是“发现新项目”) github个人笔记仓库 https://github.com/ZHLOVEYY/IT_note gitee 个人笔记仓库 https://gitee.com/harryhack/it_note 个人学习,学习过程中还会不断补充&…...

数据库系统概论(十三)详细讲解SQL中数据更新(插入,修改与更新)
数据库系统概论(十三)详细讲解SQL中数据更新 前言一、数据插入1. 插入数据是什么?2.插入单条数据(插入元组)场景 1:指定部分列插入场景 2:不指定列名(插入所有列)场景 3&…...
JVMTI 在安卓逆向工程中的应用
JVMTI 在安卓逆向工程中的应用 JVMTI 在安卓逆向工程中扮演着重要角色,尤其是在分析和修改 Java 层应用行为时。以下是其核心应用场景、实现方式及典型工具: 一、核心应用场景 1. 动态代码注入与 hook 通过 JVMTI 可以在运行时修改或拦截 Java 方法&…...

极客时间-《搞定音频技术》-学习笔记
极客时间-《搞定音频技术》-学习笔记 语音基础知识 https://www.zhangzhenhu.com/audio/feature.html 序章-0 作者说这个语音技术啊,未来肯定前景大好啊,大家都来学习,然后给出了课程的脑图 音频基础 什么是声音 声音的三要素是指响度、…...

网络攻防技术十三:网络防火墙
文章目录 一、网络防火墙概述1、网络型防火墙(网络防火墙)2、Web应用防火墙3、数据库防火墙4、主机防火墙(个人防火墙)5、网络防火墙的功能 二、防火墙工作原理1、无状态包过滤防火墙2、有状态包过滤防火墙(状态检测/动…...

Express 集成Sequelize+Sqlite3 默认开启WAL 进程间通信 Conf 打包成可执行 exe 文件
代码:express-exe: 将Express开发的js打包成exe服务丢给客户端使用 实现目标 Express 集成 Sequelize 操作 Sqlite3 数据库; 启动 Sqlite3 时默认开启 WAL 模式,避免读写互锁,支持并发读; 利用 Conf 实现主进程与 Ex…...
CppCon 2015 学习:A C++14 Approach to Dates and Times
Big Picture — 日期库简介 扩展 标准库 这个库是对 C 标准库中 <chrono> 的自然延伸,专注于处理“日历”相关的功能(比如年月日、闰年、节假日等),而不仅仅是时间点和时长。极简设计 它是**单头文件(header-on…...
基于CNN的OFDM-IM信号检测系统设计与实现
基于CNN的OFDM-IM信号检测系统设计与实现 摘要 本文详细研究了基于卷积神经网络(CNN)的正交频分复用索引调制(OFDM-IM)信号检测方法。通过在不同信噪比(SNR)和信道条件下进行系统仿真,对比分析了CNN检测器与传统最大似然(ML)检测器的误码率(BER)性能和计算复杂度。实验结果表…...
macos常见且应该避免被覆盖的系统环境变量(避免用 USERNAME 作为你的自定义变量名)
文章目录 macos避免用 USERNAME 作为你的自定义变量名macos常见且应该避免被覆盖的系统环境变量 macos避免用 USERNAME 作为你的自定义变量名 问题: 你执行了:export USERNAME“admin” 然后执行:echo ${USERNAME} 输出却是:xxx …...

2024年认证杯SPSSPRO杯数学建模D题(第二阶段)AI绘画带来的挑战解题全过程文档及程序
2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现: 2023 年开年,ChatGPT 作为一款聊天型AI工具,成为了超越疫情的热门词条;而在AI的另一个分支——绘图领域,一款名为Midjourney(MJÿ…...
深入理解CSS常规流布局
引言 在网页设计中,理解元素如何排列和相互作用至关重要。CSS提供了三种主要的布局方式:常规流、浮动和定位。本文将重点探讨最基础也是最常用的常规流布局(Normal Flow),帮助开发者掌握页面布局的核心机制。 什么是…...

DOCKER使用记录
1、拉取镜像 直接使用docker pull <image>,大概率会出现下面的报错信息: (base) jetsonyahboom:~$ docker pull ubuntu:18.04 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while …...
MYSQL中常见的函数和使用
字符串函数 CONCAT(str1,str2,...,strN) :用于将多个字符串连接成一个字符串。例如,SELECT CONCAT(SQL, , 函数) ,结果为 “SQL 函数”。 LOWER(str) :将字符串中的所有字母转换为小写。例如,SELECT LOWER(MySQL Fun…...

【深度学习相关安装及配环境】Anaconda搭建虚拟环境并安装CUDA、cuDVV和对应版本的Pytorch,并在jupyter notebook上部署
目录 1. 查看自己电脑的cuda版本2.安装cuda关于环境变量的配置测试一下,安装完成 3.安装cuDVV环境变量的配置测试一下,安装完成 4.创建虚拟环境先安装镜像源下载3.11版本py 5.在虚拟环境下,下载pytorch6.验证是否安装成功7.在jupyter noteboo…...

web3-区块链基础:从区块添加机制到哈希加密与默克尔树结构
区块链基础:从区块添加机制到哈希加密与默克尔树结构 什么是区块链 抽象的回答: 区块链提供了一种让多个参与方在没有一个唯一可信方的情况下达成合作 若有可信第三方 > 不需要区块链 [金融系统中常常没有可信的参与方] 像股票市场,或者一个国家的…...

TCP小结
1. 核心特性 面向连接:通过三次握手建立连接,四次挥手终止连接,确保通信双方状态同步。 TCP连接建立的3次握手 抓包: client发出连接请求; server回应client请求,并且同步发送syn连接; clien…...
django ssh登录 并执行命令
在Django开发环境中,通常不推荐直接通过SSH登录到服务器并执行命令,因为这违背了Django的架构设计原则,即前端与后端分离。Django主要负责处理Web请求、逻辑处理和数据库交互,而不直接执行系统级命令。然而,在某些情况…...
unix/linux,sudo,其高级使用
掌握了sudo的基石,现在是时候向更高阶的技巧和应用进发了!sudo的强大远不止于简单的sudo <command>。它的高级用法能让你在复杂的系统管理和安全场景中游刃有余,如同经验丰富的物理学家巧妙运用各种定律解决棘手问题。 sudo 的高级使用技巧与场景 精细化命令控制与参…...

Python 打包指南:setup.py 与 pyproject.toml 的全面对比与实战
在 Python 开发中,创建可安装的包是分享代码的重要方式。本文将深入解析两种主流打包方法——setup.py 和 pyproject.toml,并通过一个实际项目示例,展示如何使用现代的 pyproject.toml 方法构建、测试和发布 Python 包。 一、setup.py 与 pyp…...
计算机视觉与深度学习 | 基于OpenCV的实时睡意检测系统
基于OpenCV的实时睡意检测系统 下面是一个完整的基于OpenCV的睡意检测系统实现,该系统使用眼睛纵横比(EAR)算法检测用户是否疲劳或瞌睡。 import cv2 import numpy as np import dlib from scipy.spatial import distance as dist import pygame import time# 初始化pygame用…...
python打卡day44@浙大疏锦行
知识点回顾: 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战:resnet18 作业: 尝试在cifar10对比如下其他的预训练模型,观察差异,尽可能和他人选择的不同尝试通过ctrl进入resnet的…...

性能优化 - 案例篇:缓存_Guava#LoadingCache设计
文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载(CacheLoader)2.2.1 示例代码 2.3 缓存移除与监听(invalidate removalListener) 3. 缓存回收策略3.1 基于容量的回收&…...
NiceGUI 是一个基于 Python 的现代 Web 应用框架
NiceGUI 是一个基于 Python 的现代 Web 应用框架,它允许开发者直接使用 Python 构建交互式 Web 界面,而无需编写前端代码。以下是 NiceGUI 的主要功能和特点: 核心功能 1.简单易用的 UI 组件 提供按钮、文本框、下拉菜单、滑块、图表等常见…...
生动形象理解CNN
好的!我们把卷积神经网络(CNN)想象成一个专门识别图像的“侦探小队”,用破案过程来生动解释它的工作原理: 🕵️♂️ 案件:识别一张“猫片” 侦探小队(CNN)的破案流程&am…...