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

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

ruisui881个月前 (03-30)技术分析15

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

财务未来:数字化全流程自动化报销,让预算管理更轻松

财务管理是企业经营的重中之重,费控管理则是财务管理的核心之一。上至管理层下至普通员工,面对繁琐的费控管理却是“家家有本难念的经”。举个常见的例子:在传统企业的费用管理模式下,员工在进行商务活动时,通常需要自行垫资,之后再经过一系列繁杂的报销审批流程,才能最终实现打款。对于普通员工来说,申报流程繁琐,...

Linux 最主要的发行分支

Linux 有数百个发行分支。主要的有以下四个。slackwareSlackware 是由 Patrick Volkerding 在 1992 年推出的,它是全球现存最古老的 Linux 发行版。Slackware 被设计为高度可定制和强大的,并且要求用户了解 每个元素,它的包系统是不支持依赖的。...

gitlab常用命令大全

GitLab常用命令大全GitLab是一个基于Git的Web平台,它不仅提供代码托管,还集成了持续集成/持续交付(CI/CD)、代码审查、问题追踪等功能。在日常使用GitLab的过程中,我们常常需要使用一系列命令来管理代码仓库、处理分支和标签等。以下是GitLab常用的Git命令大全,并附上详细解释...

neovim 0.9在win下配置 python开发环境

初级的一些配置点击下面链接查看neovim安装插件管理器neovim常用快捷键neovim python开发环境简易配置方法 (需要手动键入命令行 运行python)安装neovim python的模块pip install pynvim pip install jedi pip install n...

三维家-系统快捷键使用

快键件使用:通过简单的键盘+鼠标操作,快速完成搭配。1.基础快捷键1) Ctrl+V:复制选中对象第一步:鼠标左击物体,按下Ctrl+V 即可复制选中对象。2) Ctrl+G:组合多选对象第一步:按住Ctrl键多选对象--按住Ctrl+G--确定。3) Ctrl+B:解组选中对象第一步:左击选中对象...

vue3使用vue-router路由(路由懒加载、路由传参)

vue-router 是 vue的一个插件库1. 专门用来实现一个SPA单页面应用2 .基于vue的项目基本都会用到此库SPA的理解1) 单页Web应用(single page web application,SPA)2) 整个应用只有一个完整的页面3) 点击页面中的链接不会刷新页面, 本身也不会向...