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

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

ruisui884周前 (03-30)技术分析14

基于最新版本(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零基础入门教程(下篇)” 的相关文章

细数5款国外热门Linux发行版

Linux系统已经与我们的生活息息相关,当你用Android手机浏览这篇文章时,你就已经在使用Linux系统。当然作为编程开发最热门的系统,他还有很多专注于开发使用的版本。Fedora热门入门推荐,一款优秀的程序猿专供Linux发行版,自带开发者门户,集成大量教程指南、开发集成环境、虚拟机等工具,简...

7 招教你轻松搭建以图搜图系统

作者 | 小龙责编 | 胡巍巍当您听到“以图搜图”时,是否首先想到了百度、Google 等搜索引擎的以图搜图功能呢?事实上,您完全可以搭建一个属于自己的以图搜图系统:自己建立图片库;自己选择一张图片到库中进行搜索,并得到与其相似的若干图片。Milvus 作为一款针对海量特征向量的相似性检索引擎,旨在...

K8S NFS 共享存储

NFS 共享存储前面我们学习了 hostPath 与 Local PV 两种本地存储方式,但是平时我们的应用更多的是无状态服务,可能会同时发布在不同的节点上,这个时候本地存储就不适用了,往往就需要使用到共享存储了,比如最简单常用的网络共享存储 NFS,本节课我们就来介绍下如何在 Kubernetes...

数组、去重、排序、合并、过滤、删除

ES6数字去重 Array.from(new Set([1,2,3,3,4,4])) //[1,2,3,4] [...new Set([1,2,3,3,4,4])] //[1,2,3,4]2、ES6数字排序 [1,2,3,4].sort(); // [1, 2,3,4],默认是升序...

一文让你彻底搞懂 vue-Router

路由是网络工程里面的专业术语,就是通过互联把信息从源地址传输到目的地址的活动。本质上就是一种对应关系。分为前端路由和后端路由。后端路由:URL 的请求地址与服务器上的资源对应,根据不同的请求地址返回不同的资源。前端路由:在单页面应用中,根据用户触发的事件,改变URL在不刷新页面的前提下,改变显示内容...

VUE 技术栈

官网链接:https://cn.vuejs.org/什么是vue:渐进式JavaScript 框架vue-cli链接:https://cli.vuejs.org/vue-cli安装:npm install -g @vue/clivue -V创建一个项目:vue create xxxxxx模版语法:文...