TypeScript 全面学习指南 (2025最新版)

news2025/6/7 4:15:04

TypeScript 全面学习指南

目录

  1. TypeScript 简介
  2. 环境搭建与工具
  3. 基础类型
  4. 变量声明
  5. 接口(Interfaces)
  6. 类(Classes)
  7. 函数(Functions)
  8. 泛型(Generics)
  9. 枚举(Enums)
  10. 类型推论与类型断言
  11. 高级类型
  12. 模块(Modules)
  13. 命名空间(Namespaces)
  14. 装饰器(Decorators)
  15. Mixins
  16. 声明文件(.d.ts)与使用第三方库
  17. tsconfig.json 配置详解
  18. 编译与构建
  19. 调试
  20. 与JavaScript互操作
  21. 最佳实践
  22. 常见问题与解决方案
  23. 学习资源

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: 非原始类型(非numberstringbooleansymbolnull, 或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是private
        console.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,    // 0
    Down,  // 1
    Left,  // 2
    Right  // 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 {
    // Disposable
    isDisposed: boolean = false;
    dispose!: () => void;
    // Activatable
    isActive: 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2401173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ToolsSet之:XML工具

ToolsSet是微软商店中的一款包含数十种实用工具数百种细分功能的工具集合应用&#xff0c;应用基本功能介绍可以查看以下文章&#xff1a; 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…

数据库系统概论(十三)详细讲解SQL中数据更新(插入,修改与更新)

数据库系统概论&#xff08;十三&#xff09;详细讲解SQL中数据更新 前言一、数据插入1. 插入数据是什么&#xff1f;2.插入单条数据&#xff08;插入元组&#xff09;场景 1&#xff1a;指定部分列插入场景 2&#xff1a;不指定列名&#xff08;插入所有列&#xff09;场景 3&…

极客时间-《搞定音频技术》-学习笔记

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

网络攻防技术十三:网络防火墙

文章目录 一、网络防火墙概述1、网络型防火墙&#xff08;网络防火墙&#xff09;2、Web应用防火墙3、数据库防火墙4、主机防火墙&#xff08;个人防火墙&#xff09;5、网络防火墙的功能 二、防火墙工作原理1、无状态包过滤防火墙2、有状态包过滤防火墙&#xff08;状态检测/动…

Express 集成Sequelize+Sqlite3 默认开启WAL 进程间通信 Conf 打包成可执行 exe 文件

代码&#xff1a;express-exe: 将Express开发的js打包成exe服务丢给客户端使用 实现目标 Express 集成 Sequelize 操作 Sqlite3 数据库&#xff1b; 启动 Sqlite3 时默认开启 WAL 模式&#xff0c;避免读写互锁&#xff0c;支持并发读&#xff1b; 利用 Conf 实现主进程与 Ex…

2024年认证杯SPSSPRO杯数学建模D题(第二阶段)AI绘画带来的挑战解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现&#xff1a; 2023 年开年&#xff0c;ChatGPT 作为一款聊天型AI工具&#xff0c;成为了超越疫情的热门词条&#xff1b;而在AI的另一个分支——绘图领域&#xff0c;一款名为Midjourney&#xff08;MJ&#xff…

DOCKER使用记录

1、拉取镜像 直接使用docker pull <image>&#xff0c;大概率会出现下面的报错信息&#xff1a; (base) jetsonyahboom:~$ docker pull ubuntu:18.04 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while …

【深度学习相关安装及配环境】Anaconda搭建虚拟环境并安装CUDA、cuDVV和对应版本的Pytorch,并在jupyter notebook上部署

目录 1. 查看自己电脑的cuda版本2.安装cuda关于环境变量的配置测试一下&#xff0c;安装完成 3.安装cuDVV环境变量的配置测试一下&#xff0c;安装完成 4.创建虚拟环境先安装镜像源下载3.11版本py 5.在虚拟环境下&#xff0c;下载pytorch6.验证是否安装成功7.在jupyter noteboo…

web3-区块链基础:从区块添加机制到哈希加密与默克尔树结构

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

TCP小结

1. 核心特性 面向连接&#xff1a;通过三次握手建立连接&#xff0c;四次挥手终止连接&#xff0c;确保通信双方状态同步。 TCP连接建立的3次握手 抓包&#xff1a; client发出连接请求&#xff1b; server回应client请求&#xff0c;并且同步发送syn连接&#xff1b; clien…

Python 打包指南:setup.py 与 pyproject.toml 的全面对比与实战

在 Python 开发中&#xff0c;创建可安装的包是分享代码的重要方式。本文将深入解析两种主流打包方法——setup.py 和 pyproject.toml&#xff0c;并通过一个实际项目示例&#xff0c;展示如何使用现代的 pyproject.toml 方法构建、测试和发布 Python 包。 一、setup.py 与 pyp…

性能优化 - 案例篇:缓存_Guava#LoadingCache设计

文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载&#xff08;CacheLoader&#xff09;2.2.1 示例代码 2.3 缓存移除与监听&#xff08;invalidate removalListener&#xff09; 3. 缓存回收策略3.1 基于容量的回收&…

python入门(1)

第一章 第一个python程序 1.1 print函数 print方法的作用 : 把想要输出的内容打印在屏幕上 print("Hello World") 1.2 输出中文 在Python 2.x版本中&#xff0c;默认的编码方式是ASCII编码方式&#xff0c;如果程序中用到了中文&#xff0c;直接输出结果很可能会…

【PDF提取表格】如何提取发票内容文字并导出到Excel表格,并将发票用发票号改名,基于pdf电子发票的应用实现

应用场景 该应用主要用于企业财务部门或个人处理大量电子发票&#xff0c;实现以下功能&#xff1a; 自动从 PDF 电子发票中提取关键信息&#xff08;如发票号码、日期、金额、销售方等&#xff09;将提取的信息整理并导出到 Excel 表格&#xff0c;方便进行财务统计和报销使…

Hugging Face 最新开源 SmolVLA 小模型入门教程(一)

系列文章目录 目录 系列文章目录 前言 一、引言 二、认识 SmolVLA&#xff01; 三、如何使用SmolVLA&#xff1f; 3.1 安装 3.2 微调预训练模型 3.3 从头开始训练 四、方法 五、主要架构 5.1 视觉语言模型&#xff08;VLM&#xff09; 5.2 动作专家&#xff1a;流匹…

封闭内网安装配置VSCode Anconda3 并配置 PyQt5开发

封闭内网安装配置VSCode Anconda3 并配置 PyQt5开发 零一 vscode1.1 下载 vscode1.2 下载插件1.3 安装 二 anaconda 32.1 下载2.2 新建虚拟环境1 新建快捷方式,启动base2 新建虚拟环境 3 配置Qt designer3.1 designer.exe和uic.exe3.2 设置插件,3.4 ui文件转为py文件 4使用4.1 …

大话软工笔记—组合要素2之逻辑

1. 逻辑的概念 逻辑&#xff0c;指的是思维的规律和规则&#xff0c;是对思维过程的抽象。 结合逻辑的一般定义以及信息系统的设计方法&#xff0c;对逻辑的概念进行抽提、定义为三个核心内涵&#xff0c;即&#xff1a;规律、顺序、规则。 &#xff08;1&#xff09;规律&a…

7.Demo Js执行同步任务,微任务,宏任务的顺序(3)

一个包含 同步任务、微任务&#xff08;Promise&#xff09;、宏任务&#xff08;setTimeout&#xff09; 的例子&#xff0c;JS 是怎么调度这些任务的。 &#x1f3af; 例子代码&#xff08;建议复制到浏览器控制台运行&#xff09; console.log(‘同步任务 1’); setTimeo…

边缘计算网关赋能沸石转轮运行故障智能诊断的配置实例

一、项目背景 在环保行业&#xff0c;随着国家对大气污染治理要求的不断提高&#xff0c;VOCs废气处理成为了众多企业的重要任务。沸石转轮作为一种高效的VOCs治理设备&#xff0c;被广泛应用于石油化工、汽车制造、印刷包装等主流行业。这些行业生产规模大、废气排放量多&…