当前位置:首页 > 技术分析 > 正文内容

TypeScript零基础入门教程(下篇)

ruisui883个月前 (03-30)技术分析35

基于最新版本(2025年整理,掌握泛型编程与工程化实战)


一、泛型编程:打造灵活可复用的类型组件

1.1 泛型基础:类型参数化

核心思想:将类型作为参数传递,实现代码复用与类型安全

// 泛型函数:返回类型与参数类型绑定  
function identity(arg: T): T {  
  return arg;  
}  
let output1 = identity("hello"); // 显式指定类型  
let output2 = identity(100);              // 自动类型推断  

// 泛型接口  
interface GenericArray {  
  [index: number]: T;  
}  
const numArray: GenericArray = [1, 2, 3];  

1.2 泛型约束:限制类型范围

interface Lengthwise {  
  length: number;  
}  

// 约束T必须包含length属性  
function logLength(arg: T): void {  
  console.log(arg.length);  
}  

logLength("hello"); //  length为5  
logLength(100);     //  number没有length属性  

1.3 常见工具类型解析

工具类型

作用

示例

Partial

使所有属性变为可选

Partial<{name: string> → {name?: string}

Readonly

使所有属性变为只读

Readonly<{id: number> → {readonly id: number}

Pick

从T中挑选指定属性K

Pick<{name: string age: number name> → {name: string}

Record

创建键类型为K,值类型为T的对象

`Record<"a"

// 工具类型实战:快速构造类型  
type User = {  
  id: number;  
  name: string;  
  email: string;  
};  

type UserPreview = Pick;  
type OptionalUser = Partial;  

二、模块与命名空间:组织大型项目代码

2.1 ES Module:现代模块化标准

// math.ts  
export function add(a: number, b: number): number {  
  return a + b;  
}  

export const PI = 3.1415;  

// app.ts  
import { add, PI } from "./math";  
console.log(add(PI, 2));  

2.2 命名空间:传统代码组织方式

namespace Utilities {  
  export function formatDate(date: Date): string {  
    return date.toISOString();  
  }  
}  

// 使用命名空间  
Utilities.formatDate(new Date());  

// 嵌套命名空间  
namespace Company {  
  export namespace HR {  
    export class Employee {}  
  }  
}  

现代建议:新项目优先使用ES Module,命名空间仅用于旧代码维护


三、工程化配置:构建企业级TS项目

3.1tsconfig.json核心配置详解

{  
  "compilerOptions": {  
    "target": "ES2025",          // 编译目标JS版本  
    "module": "ESNext",          // 模块系统(CommonJS/ES6等)  
    "strict": true,              // 开启所有严格检查  
    "esModuleInterop": true,     // 改善CommonJS模块导入兼容性  
    "skipLibCheck": true,        // 跳过声明文件类型检查(加快编译)  
    "outDir": "./dist",          // 输出目录  
    "rootDir": "./src",          // 源码目录  
    "baseUrl": "./",             // 模块解析基准路径  
    "paths": {                   // 路径别名(需配合打包工具使用)  
      "@utils/*": ["src/utils/*"]  
    }  
  },  
  "include": ["src/**/*.ts"],    // 包含文件  
  "exclude": ["node_modules"]     // 排除文件  
}  

3.2 结合Webpack配置TS(2025最新实践)

// webpack.config.js  
const path = require('path');  

module.exports = {  
  entry: './src/index.ts',  
  module: {  
    rules: [  
      {  
        test: /\.ts$/,  
        use: 'ts-loader',  
        exclude: /node_modules/  
      }  
    ]  
  },  
  resolve: {  
    extensions: ['.ts', '.js'],  
    alias: {  
      '@utils': path.resolve(__dirname, 'src/utils/')  
    }  
  },  
  output: {  
    filename: 'bundle.js',  
    path: path.resolve(__dirname, 'dist')  
  }  
};  

3.3 Vite集成TS的极致开发体验

# 创建Vite项目  
npm create vite@latest my-ts-app -- --template react-ts  

# 项目结构说明:  
# - src/main.tsx: TSX入口文件  
# - vite.config.ts: 自带TS支持  

四、综合实战:TS+React电商购物车

4.1 定义核心类型

// types/product.ts  
export interface Product {  
  id: string;  
  name: string;  
  price: number;  
  inventory: number;  
}  

// types/cart.ts  
export type CartItem = Product & { quantity: number };  

4.2 实现购物车逻辑

// components/Cart.tsx  
import { useState } from 'react';  

const Cart = () => {  
  const [cartItems, setCartItems] = useState([]);  

  const addToCart = (product: Product) => {  
    setCartItems(prev => {  
      const existing = prev.find(item => item.id === product.id);  
      if (existing) {  
        return prev.map(item =>  
          item.id === product.id  
            ? { ...item, quantity: item.quantity + 1 }  
            : item  
        );  
      }  
      return [...prev, { ...product, quantity: 1 }];  
    });  
  };  

  return (  
    

购物车 ({cartItems.length})

{cartItems.map(item => (
{item.name} × {item.quantity}
))}
); };

4.3 实现商品列表

// components/ProductList.tsx  
import { Product } from '../types/product';  

interface Props {  
  products: Product[];  
  onAddToCart: (product: Product) => void;  
}  

const ProductList = ({ products, onAddToCart }: Props) => {  
  return (  
    
{products.map(product => (

{product.name}

yen{product.price}

))}
); };

五、TypeScript工程化最佳实践

5.1 类型声明文件(.d.ts)管理

// types/global.d.ts  
declare module "*.svg" {  
  const content: string;  
  export default content;  
}  

declare interface Window {  
  __APP_VERSION__: string;  
}  

5.2 渐进式迁移策略

  1. 步骤一:将文件后缀改为.ts,修复基础类型错误
  2. 步骤二:为第三方库安装@types/声明包
  3. 步骤三:逐步添加严格模式选项(strictNullChecks等)
  4. 步骤四:重构复杂逻辑,引入高级类型

六、常见问题QA

Q1:泛型中的T和U有什么区别?

:只是类型参数命名约定,实际可用任意字母(如K/V)。通常:

  • T:Type的缩写,主要类型
  • U:次要类型
  • K:Key类型
  • V:Value类型

Q2:为什么我的Webpack构建TS报错?

:检查是否同时满足:

  1. 安装了ts-loader和typescript
  2. webpack配置了.ts文件处理规则
  3. 存在正确的tsconfig.json

Q3:TS项目如何调试?

:推荐方式:

  1. VSCode安装Debugger for Chrome插件
  2. 配置launch.json:
{  
  "type": "chrome",  
  "request": "launch",  
  "name": "Debug TS",  
  "url": "http://localhost:3000",  
  "webRoot": "${workspaceFolder}/src",  
  "sourceMapPathOverrides": {  
    "../*": "${webRoot}/*"  
  }  
}  

全系列总结

  • 上篇:搭建环境 → 基础类型 → 类型系统
  • 中篇:函数与对象 → 接口 → 高级类型
  • 下篇:泛型编程 → 工程化 → 实战项目

下一步学习建议

  1. 参与开源TS项目(如Vue3源码)
  2. 学习类型体操(Type Challenges)
  3. 探索TS 5.0+新特性:装饰器、satisfies运算符

(感谢学习本系列教程,现在你已经具备TS开发大型应用的能力,开始你的类型安全编程之旅吧!)

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3161.html

标签: vite svg
分享给朋友:

“TypeScript零基础入门教程(下篇)” 的相关文章

驾校学员培训费用管理系统

今天来了解《#驾校学员培训费用管理系统》,它包括如下功能:车辆信息表格界面,车辆登记信息窗口,教练职工录入信息窗口,教练职工信息表格界面,班别设置表格界面,费用类别设置表格界面,学员档案表格界面,学员信息录入信息窗口,学员信息录入信息窗口辅助录入,学员信息录入信息窗口辅助录入 (1),在陪学员查询表...

带你五步学会Vue SSR

作者:liuxuan 前端名狮转发链接:https://mp.weixin.qq.com/s/6K6GUHcLwLG4mzfaYtVMBQ前言SSR大家肯定都不陌生,通过服务端渲染,可以优化SEO抓取,提升首页加载速度等,我在学习SSR的时候,看过很多文章,有些对我有很大的启发作用,有些就只是照搬官...

gitlab简单搭建与应用

一、gitlab1、简介GitLab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。与Github类似,GitLab能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历...

代码分支规范

一.gitflow工作流说明:主分支:master,稳定版本代码分支,对外可以随时编译发布的分支,不允许直接Push代码,只能请求合并(pull request),且只接受hotfix、release分支的代码合并。gitlab上做限制。热修复分支:hotfix,针对现场紧急问题、bug修复的代码分...

jvm疯狂吃内存,到底是谁的锅?

jvm应该是每一个java程序员都需要掌握的内容,但是在没有遇到问题之前,很多都是基于理论的,唯有实战才能增加个人的知识储备。本文是从一个角度来分析是谁在狂吃内存,希望对你有所帮助。本文是易观技术人员注意到一台开发机上各个微服务进程占用内存很高,随即便展开了调查......ps:本文来源于:http...

全新斯柯达柯珞克Karoq深度评测:大众替代品

“斯柯达柯珞克是一款出色的全能家庭 SUV,具有许多有用的功能”价格36,605 英镑- 49,190 英镑优点方便的 VarioFlex 后排座椅非常适合家庭入住驾驶乐趣缺点保修期短保守的内饰性格比Yeti少结论——斯柯达柯珞克是一辆好车吗?斯柯达柯珞克是在辉煌的七座 斯柯达柯迪亚克之后推出的,因...